Главная >> Инструкции >> Компиляция программ Linux

Компиляция программ Linux

Все программы для компьютера представляют собой набор команд процессора, которые состоят из определенного набора бит. Этих команд несколько сотен и с помощью них выполняются все действия на вашем компьютере. Но писать программы непосредственно с помощью этих команд сложно. Поэтому были придуманы различные языки программирования, которые проще для восприятия человеку.

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

В этой статье мы рассмотрим, как выполняется компиляция программ Linux, как происходит процесс компиляции, а также рассмотрим насколько гибко вы сможете все настроить.


Содержание статьи

Подготовка системы

Мы будем компилировать программы, написанные на Си или С++, так как это наиболее используемый язык для программ, которые требуют компиляции. Мы уже немного рассматривали эту тему в статье установка из tar.gz в Linux, но та статья ориентирована больше на новичков, которым нужно не столько разобраться, сколько получить готовую программу.

В этой же статье тема рассмотрена более детально. Как вы понимаете, для превращения исходного кода в команды процессора нужно специальное программное обеспечение. Мы будем использовать компилятор GCC. Для установки его и всех необходимых инструментов в Ubuntu выполните:

sudo apt install build-essential manpages-dev git automake autoconf

compiling6

Затем вы можете проверить правильность установки и версию компилятора:

 gcc --version

compiling5

Но перед тем как переходить к самой компиляции программ рассмотрим более подробно составляющие этого процесса.

Как выполняется компиляция?

Компиляция программы Linux - это довольно сложный процесс. Все еще сложнее, потому что код программы содержится не в одном файле и даже не во всех файлах ее исходников. Каждая программа использует множество системных библиотек, которые содержат стандартные функции. К тому же один и тот же код должен работать в различных системах, содержащих различные версии библиотек.

На первом этапе, еще до того как начнется непосредственно компиляция, специальный инструмент должен проверить совместима ли ваша система с программой, а также есть ли все необходимые библиотеки. Если чего-либо нет, то будет выдана ошибка и вам придется устранить проблему.

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

Затем все объектные файлы собираются в одну программу, связываются с системными библиотеками. После завершения этого этапа программу остается только установить в файловую систему и все. Вот такие основные фазы компиляции программы, а теперь перейдем ближе к практике.

Компиляция программ Linux

Первое что нам понадобиться - это исходники самой программы. В этом примере мы будем собирать самую последнюю версию vim. Это вполне нейтральная программа, достаточно простая и нужная всем, поэтому она отлично подойдет для примера.

Получение исходников

Первое что нам понадобиться, это исходные коды программы, которые можно взять на GitHub. Вы можете найти исходники для большинства программ Linux на GitHub. Кроме того, там же есть инструкции по сборке:

compiling7

Давайте загрузим сами исходники нашей программы с помощью утилиты git:

git clone https://github.com/vim/vim

compiling8

Также, можно было скачать архив на сайте, и затем распаковать его в нужную папку, но так будет удобнее. Утилита создаст папку с именем программы, нам нужно сделать ее рабочей:

cd vim

Настройка configure

Дальше нам нужно запустить скрипт, который проверит нашу программу на совместимость с системой и настроит параметры компиляции. Он называется configure и поставляется разработчиками программы вместе с исходниками. Весь процесс компиляции описан в файле Makefile, его будет создавать эта утилита.

Если configure нет в папке с исходниками, вы можете попытаться выполнить такие скрипты чтобы его создать:

./bootstrap
./autogen.sh

Также для создания этого скрипта можно воспользоваться утилитой automake:

aclocal
autoheader
automake --gnu --add-missing --copy --foreign
autoconf -f -Wall

Утилита automake и другие из ее набора генерируют необходимые файлы на основе файла Mackefile.am. Этот файл обязательно есть в большинстве проектов.

После того как вы получили configure мы можем переходить к настройке. Одним из огромных плюсов ручной сборки программ есть то, что вы можете сами выбрать с какими опциями собирать программу, где она будет размещена и какие дополнительные возможности стоит включить. Все это настраивается с помощью configure. Полный набор опций можно посмотреть, выполнив:

./configure --help

compiling1

Рассмотрим наиболее часто используемые, стандартные для всех программ опции:

  • --prefix=PREFIX - папка для установки программы, вместо /, например, может быть /usr/local/, тогда все файлы будут распространены не по основной файловой системе, а в /usr/local;
  • --bindir=DIR - папка для размещения исполняемых файлов, должна находится в PREFIX;
  • --libdir=DIR - папка для размещения и поиска библиотек по умолчанию, тоже в PREFIX;
  • --includedir=DIR - папка для размещения man страниц;
  • --disable-возможность - отключить указанную возможность;
  • --enable-возможность - включить возможность;
  • --with-библиотека - подобно enable активирует указанную библиотеку или заголовочный файл;
  • --without-библиотека - подобное disable отключает использование библиотеки.

Вы можете выполнить configure без опций, чтобы использовать значения по умолчанию, но также можете вручную указать нужные пути. В нашем случае ./configure есть, и мы можем его использовать:

./configure

compiling2

Во время настройки утилита будет проверять, есть ли все необходимые библиотеки в системе, и если нет, вам придется их установить или отключить эту функцию, если это возможно. Например, может возникнуть такая ошибка: no terminal library found checking for tgetent()... configure: error: NOT FOUND!

compiling3

В таком случае нам необходимо установить требуемую библиотеку. Например, программа предлагает ncurses, поэтому ставим:

sudo apt install libncurces-dev

Приставка lib всегда добавляется перед библиотеками, а -dev - означает, что нам нужна библиотека со всеми заголовочными файлами. После удовлетворения всех зависимостей настройка пройдет успешно.

Сборка программы

Когда настройка будет завершена и Makefile будет готов, вы сможете перейти непосредственно к сборке программы. На этом этапе выполняется непосредственно преобразование исходного кода в машинный. Утилита make на основе Makefile сделает все необходимые действия:

make

compiling4

Дальше осталось установить саму программу, если вы использовали опцию prefix, чтобы не устанавливать программу в основную файловую систему, то можно применить стандартную опцию make:

make install

После этого программа будет установлена в указанную вами папку, и вы сможете ее использовать. Но более правильный путь - создавать пакет для установки программы, это делается с помощью утилиты checkinstall, она позволяет создавать как deb, так и rpm пакеты, поэтому может использоваться не только в Ubuntu. Вместо make install выполните:

checkinstall

Затем просто установите получившийся пакет с помощью dpkg:

sudo dpkg install vim.deb

После этого сборка программы полностью завершена и установлена, так что вы можете переходить к полноценному использованию.

Если вы устанавливали программу с помощью make install, то удалить ее можно выполнив в той же папке обратную команду:

sudo make uninstall

Команда удалит все файлы, которые были скопированы в файловую систему.

Выводы

В этой статье мы рассмотрели, как выполняется компиляция программы Linux. Этот процесс может быть сложным для новичков, но в целом, все возможно, если потратить на решение задачи несколько часов. Если у вас остались вопросы, спрашивайте в комментариях!

На завершение видео о том, что такое компилятор и интерпретатор:

13 комментариев к “Компиляция программ Linux”

  1. Люблю Ubuntu - не люблю убунту юзеров : "ААААА не работаит!Афтар дИбил!!"
    В дженту вас сослать на повышение квалификации.

    Ответить
  2. Программируйте на Phyton, интерпретируемый и к тому же OpenSource, кроссплатформенный в отличии от этих С/С++. Написал код/скрипт и он тут же работает, не требуется секса с компиляцией, так то.

    Ответить
  3. Ни один из способов компиляции не помог. Нет там никаких файлов configure, bootstrap, autogen.sh , не работают команды и далее которые выдаёт 'configure.ac' or 'configure.in' is required
    в папке исходников вообще никаких запускаемых файлов нет. Есть файлы с расширением cmake и ещё куча разных других непонятных помимо самого кода и заголовочных. Инструкций тоже никаких нет.

    Ответить
    • обычно авторы программ у себя на гитхабе (там где расположены исходники) или в файле README.md описывают способ компиляции ,установки и т.п.

      Ответить
  4. У меня получается собирать проект утилитой checkinstall только под sudo. Собираю freeciv версии 2.6.0 , т.к. готовая сборка этой программы есть только под винду, а на убунте устаревшая версия 2.5.х
    Пакет собирается, но не устанавливается, но это уже другая история ))

    Ответить
  5. Всё получилось, спасибо. Только в конце мой Debian 9 не захотел исполнять sudo dpkg install vim.deb Но
    sudo dpkg -i vim.deb взял в обработку без проблем. Да и ещё, не упомянули проверить название собранного пакета в папке vim. У меня он такой - vim_20190419-1_amd64.deb. Просто новички так и будут писать, как у вас в статье имя пакета.

    Ответить
  6. Спасибо за статью, кое что почерпнул. Приходилось собирать nginx с push-stream модулем, то ещё был геморрой. Если бы не обновление сервера Debian, после которого обновился этот самый nginx c версии 1.13.6 на 1.18.0, старый как раз был собран с этим самым модулем, я бы наверное ещё долго бы откладывал изучение установки программ из исходников. После дня мучений теперь на сервере nginx версии 1.18.0 с нужным модулем.

    Ответить
  7. А как собрать бинарный файл со всеми библиотеками, чтобы можно было запускать его в системе без установки этих библиотек?

    Ответить
  8. умные ребятушки, можно ли для дураков, что-то по проще?
    Вот есть конкретная программа в tar.gz есть линукс минт, как её установить?

    Ответить
    • *.tar.gz это файл архива, распаковать содержимое команда "tar xvf /путь/названиефайла.tar.gz" либо "tar xzvf /путь/названиефайла.tar.gz". Если в данном скачанном архиве распакуется .deb-пакет программы, то установить его "sudo dpkg -i /путь/названиепакета.deb". p.s. знаю уже не актуально.:)

      Ответить
  9. Спасибо вам за ваш труд! В новых версиях Debian (возможно и других дистр-ов) утилита checkinstall не входит в состав ОС по умолчанию (пишут что исключили из состава в целях безопасности), скачивал отдельно из оф. репозитория (sudo apt install checkinstall).

    Ответить

Оставьте комментарий