1. Вы находитесь в архивной версии форума xaker.name. Здесь собраны темы с 2007 по 2012 год, большинство инструкций и мануалов уже неактуальны.
    Скрыть объявление

Компилляция программ в линуксе.

Тема в разделе "FAQ", создана пользователем onthar, 14 фев 2009.

  1. onthar

    onthar Команда форума Админ

    Регистрация:
    8 янв 2008
    Сообщения:
    0
    Симпатии:
    609
    Баллы:
    0
    Вижу не всё ещё разобрались как компилировать программы в линуксе
    Попробую объяснить.

    вступление:
    программы обычно распространяются в упакованных архивах, это файлы с расширениями
    Код:
    <some_app_name>.tar.gz* (иногда .tgz)
    <some_app_name>.tar.bz2 
    нужно понимать отличие между архивом и упаковщиком.

    Для архивирования диркторий и файлов используется программа tar результатом её работы получается файл
    с расширением .tar
    Грубо говоря это копия файловой системы(директорий и файлов с их атрибутами и правами доступа)
    но помещённые в один файл.

    Данный файл по размеру будет чуть больше чем суммарный размер файлов которые были заархивированы.
    поэтому (а может и просто так) используют упаковщики, программы которые позволяют уменьшить размер файла без потери данных.

    Так вот не многие упаковщики умеют работать с несколькими файлами, но зато с одним справляются на ура.
    результатом работы упаковщика gzip будет файл с расширением .gz
    Таким образом файл заканчивающийся на .tar.gz это результат работы двух программ!

    tar.gz аналогичен файлу с расширением zip только zip не позволяет сохранить все атрибуты и права доступа.
    Таким образом чтобы распаковать файл tar.gz нужно воспользоваться двумя программами.
    gunzip распакует файл например результатом команды

    Код:
    gunzip -d <some_app_name>.tar.gz
    будет файл
    <some_app_name>.tar
    а команда tar -x* <some_app_name>.tar разархивирует его.

    К счастью для нас GNU версия программы tar умеет распаковывать, поэтому на не нужно вызывать gunzip а можно просто указать программе tar что файл нужно cначала распаковать.
    например команда

    Код:
    tar -z -x <some_app_name>.tar.gz
    сразу распакует и разархивирует.

    Отличие файлов с расширениями
    <some_app_name>.tar.gz*
    и
    <some_app_name>.tar.bz2

    лишь в том что использовались разные упаковщики, для второго файла использовалась команда bzip2
    для распаковки <some_app_name>.tar.bz2* можно выполнить команду
    Код:
    tar -j -x <some_app_name>.tar.bz2 

    немного теории:
    Для сборки программ в линуксе используется (в основном) программа make
    Которая запускает инструкции из Makefile
    но поскольку дистрибутивов линукса много и они все разные то для того чтобы собрать
    программу нужно для каждого дистрибутива отдельно прописывать пути где какие библиотеки, заголовочные файлы лежат.
    Программисты рехнулись бы изучать каждый дистрибутив и для каждого отдельно создавать Makefile
    Поэтому придумали конфигураторы :)
    Которые "изучают" систему и в соответствии с полученными знаниями создают Makefile
    но на конфигураторе они не остановились и придумали конфигураторы конфигураторов =)
    на стом они остановились :)

    Для сборки нам нужны компиляторы они прописаны в зависимостях пакета
    build-essential так что достаточно установить его со всеми зависимостями.
    Ещё нужны autoconf и все automake которые найдёте :).

    Итак чтобы собрать что то из исходниктов
    нужно сначала "собрать" конфигуратор
    как собрать конфигуратор описано в файле configure.in
    а собирается конфигуратор следующими командами


    Код:
     bootstrap или autogen.sh
    т.е. достаточно запустить этот скрипт.
    с если нет скриптов bootstrap или autogen.sh то можно выполнить последовательно следующие команды

    Код:
    aclocal
    autoheader
    automake --gnu --add-missing --copy --foreign
    autoconf -f -Wall
    
    Отмечу что все эти команды используют файл configure.in

    После выполнения этих команд создастся файл
    Код:
    configure
    Вот теперь если вы запустите конфигуратор командой
    Код:
    ./configure
    он проанализирует вашу систему скажет чего хватает/не хватает
    возможно покажет какие опции будующей программы будут доступны и/или пути куда будет
    установлена скомпилированная программа (после выполнения make install)
    Конфигуратор построит Makefile основывассь на полученных знаниях и файле
    Код:
    makefile.am
    Отмечу что можно передать конфигуратору опции предусмотренные в исходниках программы которые позволяют включать отключать те или иные возможности программы, обычно узнать о них можно командой
    Код:
    ./configure --help
    с так же есть набор стандартных опций вроде --prefix= которая указывает какой каталог использовать для установки. Для Ubuntu обычно
    Код:
    --prefix=/usr или --prefix=/usr/local 
    БЕЗ слеша в конце!

    Теперь можно запустить процесс сборки самой программы
    команда
    Код:
    make
    для сборки достаточно привелегий обычного пользователя.

    Окончанием сборки можно считать момент когда команды в консоле перестанут "беспорядочно" выполнстся и не будет слова error

    теперь всё скомпилированно и готово для установки.

    на данном этапе можно запустить
    Код:
    make install
    но уже с привилегиями root
    например командой
    Код:
    sudo make install
    Или checkinstall для того чтобы сгенерировать deb пакет.
    со хочу предупредить checkinstall не все исходники понимает.
    Поскольку автор программы может написать особые скрипты по установке и checkinstall их не поймёт.

    ничего страшного в том что вы установите программу не пакетом а командой make install нет, программу всегда можно удалить командой make uninstall выполнив её в корневой директории исходников программы (там где вы запускали make install)

    Ещё есть возможность установить пакет не в корень а в другую директорию из которой потом можно самому вручную собрать пакет, используя команду
    Код:
    fakeroot
    P.S.
    Часто на этапе конфигурации конфигуратор ругается что нехватает той или иной библиотеки. название библиотеки которое он сообщает не всегда соответствует названию пакета в Ubuntu. Из собственного опыта могу посоветовать поискать нужный пакет исключив префикс lib , если нашлось несколько пакетов различающихся приставкой -dev в названии то вам нужно установить именно -dev пакет (обычно он тянет за собой и не -dev пакет)
    Можно ещё поискать с помощью http://packages.ubuntu.com/
    В ведя имя библиотеки в поиск по содержимому пакетов, также если найдётся dev и не dev нужны оба :) .
    ну или просто погуглить.

    Если эта информация оказалась полезной для вас, то советую почитать

    http://rus-linux.net/MyLDP/HOWTO-ru/DOS-Win-to-Linux-HOWTO/DOS-Win-to-Linux-HOWTO.html


    Вот тут http://forum.beep-media-player.org/viewthread.php?tid=182
    не плохой список что нужно установить для сборки из исходников
    пакеты с буквами mm в конце описания это пакеты для C++ программ.
    Список для bmpx но подойдёт почти для любой GTK2/Gnome программы.
    Так что если не получается собрать посмотрите на этот список
    сверьте с тем что у вас стоит и может что умное в голову придёт :)

    • X
    • Compile: libx11-dev
    • Runtime: libx11-6
    • GlibMM
    • Compile: libglibmm-2.4-dev
    • Runtime: libglibmm-2.4-1c2a
    • GTK+
    • Compile: libgtk2.0-dev gtk-doc-tools
    • Runtime: libgtk2.0-0
    • GTKMM
    • Compile: libgtkmm-2.4-dev
    • Runtime: libgtkmm-2.4-1c2a
    • Glade
    • Compile: libglade2-dev
    • Runtime: libglade2-0
    • GladeMM
    • Compile: libglademm-2.4-dev
    • Runtime: libglademm-2.4-1c2a
    • XML
    • Compile: libxml2-dev
    • Runtime: libxml2
    • XML++
    • Compile: libxml++2.6-dev
    • Runtime: libxml++2.6c2a
    • DBus
    • Compile: libdbus-1-dev libdbus-glib-1-dev
    • Runtime: libdbus-1-2 libdbus-glib-1-2
    • Alsa
    • Compile: libasound2-dev
    • HAL
    • Compile: libhal-dev libhal-storage-dev
    • Runtime: libhal1 libhal-storage1
    • Gamin
    • Compile: libgamin-dev
    • Runtime: libgamin0
    • Neon
    • Compile: libneon25-dev
    • Runtime: libneon25
    • TagLib
    • Compile: libtagc0-dev
    • Runtime: libtagc0
    • Startup-Notify
    • Compile: libstartup-notification0-dev
    • Runtime: libstartup-notification0
    • Boost
    • Compile: libboost-dev libboost-filesystem-dev
    • Runtime: libboost-filesystem1.33.1
    • MusicBrainz
    • Compile: libmusicbrainz4-dev
    • Runtime: libmusicbrainz4c2a
    • GStreamer
    • Compile: libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
    • Runtime: libgstreamer0.10-0 libgstreamer-plugins-base0.10-0

     
    Последнее редактирование: 14 фев 2009
    1 человеку нравится это.

Поделиться этой страницей