- Основы компиляции программ из исходного кода в Linux
- Типичный пример
- Файлы INSTALL или README
- Установка программы с GitHub
- Autogen.sh
- Решение проблем
- Отсутствующие библиотеки
- Заключение
- Компиляция программ Linux
- Подготовка системы
- Как выполняется компиляция?
- Компиляция программ Linux
- Получение исходников
- Настройка configure
- Сборка программы
- Выводы
- Unix как IDE: Компиляция
- Компиляция и сборка объектного кода
- Препроцессор
- Связывание объектов
- Компиляция, сборка и связывание
- Включение внешних файлов и связывание
- План компиляции
- Расширенный вывод сообщений об ошибках
- Профилирование процесса компиляции
- Оптимизация
- Интерпретаторы
- Inline-код
Основы компиляции программ из исходного кода в Linux
Оригинал: Basics Of Compiling Software From Source Code In Linux
Автор: LinuxAndUbuntu
Дата публикации: 16 мая 2018 года
Перевод: А. Кривошей
Дата перевода: июнь 2018 г.
Время от времени вам может понадобиться скомпилировать программу из исходного кода. Это включает компиляцию кода C или C++ во что-то, что мы можем запустить в Linux. В зависимости от программного обеспечения, которое вы хотите скомпилировать, часто делать это необязательно, так как ваш дистрибутив, скорее всего, уже будет иметь двоичный пакет программы в репозиториях программного обеспечения. Фактически, вы должны выбрать бинарные пакеты или компиляцию из исходного кода. Однако, если когда-либо вам нужно будет скомпилировать исходный код, это руководство даст вам некоторые основные знания данного процесса.
Типичный пример
Возьмем программу, написанную на C или C++. Загрузка исходного кода часто связана с загрузкой и распаковкой пакета или клонированием репозитория git. Типичным является выполнение этих трех команд:
Первая команда запускает скрипт configure, который анализирует библиотеки, установленные в вашей системе. Если требуемая для компиляции библиотека не установлена, он сообщит об этом, и вам нужно будет установить ее. Вам понадобится не только библиотека, но и файлы разработчика. Файлы с исходным кодом используют функции, имеющиеся в этих библиотеках.
После выполнения команды configure у вас должен быть создан файл Makefile. При запуске make, эта утилита будет читать Makefile в текущем каталоге и запустит компилятор (gcc для C или g ++ для C++) для компиляции программного обеспечения.
Третья команда не является строго необходимой, но рекомендуется для обеспечения общесистемного доступа к вашей программе, чтобы запускать исполняемый файл в терминале из любого места. Эта команда говорит «make» запустить инструкции по установке программы в систему.
Файлы INSTALL или README
Могут иметься дополнительные инструкции, которые должны быть выполнены до начала компиляции. Чтение этого файла (как правило, INSTALL) также поможет узнать, какие библиотеки разработчиков, возможно, потребуется установить в первую очередь. Такие пакеты будут содержать суффикс «-dev», чтобы показать, что они относятся к разработке и должны быть установлены для компиляции. Сценарий configure также может потребовать дополнительных параметров. README содержат любую другую информацию.
Вы даже можете обнаружить, что ни одна из трех команд не запускается. Вместо этого может использоваться другой вариант make, например qmake (для проектов Qt) или cmake.
Установка программы с GitHub
Начнем с установки текстового редактора wxMEdit, найденного на GitHub. Здесь я демонстрирую, как установить программу путем компиляции из исходного кода. Это типичный пример. Если вы посетите репозиторий GitHub, вы увидите, что файл readme содержит сведения о приложении. Никаких инструкций по компиляции нет, поэтому применяется стандартная последовательность с одной разницей: autogen.sh.
Сначала мы переходим в каталог, где хотим хранить репозиторий, и клонируем его:
Autogen.sh
Если вы найдете этот файл в исходном коде, вы должны запустить его перед “./configure”, так как он выполнит задачи, которые позволят вам успешно скомпилировать программное обеспечение. Если он отработал успешно, вы можете запустить “./configure”, “make”, а затем «sudo make install» и это все, что вам нужно запустить (в данном случае ничего больше).
В выводе make не должно быть ошибок.
Решение проблем
Если вы делаете это регулярно, вы должны столкнуться с определенными проблемами при компиляции из исходного кода.
Отсутствующие библиотеки
Помните, недостаточно установленных бинарных библиотек; также должны быть установлены исходные файлы или заголовки для разработчиков . Сценарий configure вместе с документацией обычно предупреждает вас о любых библиотеках (заголовках), которые необходимо установить для успешной компиляции. Убедитесь, что они установлены в вашей системе.
Заключение
Компиляция программного обеспечения может быть довольно простой или довольно болезненной. К счастью, многие дистрибутивы Linux предоставляют двоичные пакеты, готовые к установке, поэтому компиляция из исходного кода обычно не требуется. Лучше придерживаться бинарных пакетов, предоставляемых репозиториями, если они доступны.
Другие статьи о компиляции программ из исходного кода на нашем сайте:
Источник
Компиляция программ Linux
Все программы для компьютера представляют собой набор команд процессора, которые состоят из определенного набора бит. Этих команд несколько сотен и с помощью них выполняются все действия на вашем компьютере. Но писать программы непосредственно с помощью этих команд сложно. Поэтому были придуманы различные языки программирования, которые проще для восприятия человеку.
Для подготовки программы к выполнению, специальная программа собирает ее из исходного кода на языке программирования в машинный код — команды процессора. Этот процесс называется компиляция. Linux — это свободное программное обеспечение, а поэтому исходные коды программ доступны всем желающим. Если программы нет в репозитории или вы хотите сделать что-то нестандартное, то вы можете выполнить компиляцию программы.
В этой статье мы рассмотрим, как выполняется компиляция программ Linux, как происходит процесс компиляции, а также рассмотрим насколько гибко вы сможете все настроить.
Подготовка системы
Мы будем компилировать программы, написанные на Си или С++, так как это наиболее используемый язык для программ, которые требуют компиляции. Мы уже немного рассматривали эту тему в статье установка из tar.gz в Linux, но та статья ориентирована больше на новичков, которым нужно не столько разобраться, сколько получить готовую программу.
В этой же статье тема рассмотрена более детально. Как вы понимаете, для превращения исходного кода в команды процессора нужно специальное программное обеспечение. Мы будем использовать компилятор GCC. Для установки его и всех необходимых инструментов в Ubuntu выполните:
Затем вы можете проверить правильность установки и версию компилятора:
Но перед тем как переходить к самой компиляции программ рассмотрим более подробно составляющие этого процесса.
Как выполняется компиляция?
Компиляция программы Linux — это довольно сложный процесс. Все еще сложнее, потому что код программы содержится не в одном файле и даже не во всех файлах ее исходников. Каждая программа использует множество системных библиотек, которые содержат стандартные функции. К тому же один и тот же код должен работать в различных системах, содержащих различные версии библиотек.
На первом этапе, еще до того как начнется непосредственно компиляция, специальный инструмент должен проверить совместима ли ваша система с программой, а также есть ли все необходимые библиотеки. Если чего-либо нет, то будет выдана ошибка и вам придется устранить проблему.
Дальше идет синтаксический анализ и преобразование исходного кода в объектный код, без этого этапа можно было бы и обойтись, но это необходимо, чтобы компилятор мог выполнить различные оптимизации, сделать размер конечной программы меньше, а команды процессора эффективнее.
Затем все объектные файлы собираются в одну программу, связываются с системными библиотеками. После завершения этого этапа программу остается только установить в файловую систему и все. Вот такие основные фазы компиляции программы, а теперь перейдем ближе к практике.
Компиляция программ Linux
Первое что нам понадобиться — это исходники самой программы. В этом примере мы будем собирать самую последнюю версию vim. Это вполне нейтральная программа, достаточно простая и нужная всем, поэтому она отлично подойдет для примера.
Получение исходников
Первое что нам понадобиться, это исходные коды программы, которые можно взять на GitHub. Вы можете найти исходники для большинства программ Linux на GitHub. Кроме того, там же есть инструкции по сборке:
Давайте загрузим сами исходники нашей программы с помощью утилиты git:
Также, можно было скачать архив на сайте, и затем распаковать его в нужную папку, но так будет удобнее. Утилита создаст папку с именем программы, нам нужно сделать ее рабочей:
Настройка configure
Дальше нам нужно запустить скрипт, который проверит нашу программу на совместимость с системой и настроит параметры компиляции. Он называется configure и поставляется разработчиками программы вместе с исходниками. Весь процесс компиляции описан в файле Makefile, его будет создавать эта утилита.
Если configure нет в папке с исходниками, вы можете попытаться выполнить такие скрипты чтобы его создать:
Также для создания этого скрипта можно воспользоваться утилитой automake:
Утилита automake и другие из ее набора генерируют необходимые файлы на основе файла Mackefile.am. Этот файл обязательно есть в большинстве проектов.
После того как вы получили configure мы можем переходить к настройке. Одним из огромных плюсов ручной сборки программ есть то, что вы можете сами выбрать с какими опциями собирать программу, где она будет размещена и какие дополнительные возможности стоит включить. Все это настраивается с помощью configure. Полный набор опций можно посмотреть, выполнив:
Рассмотрим наиболее часто используемые, стандартные для всех программ опции:
- —prefix=PREFIX — папка для установки программы, вместо /, например, может быть /usr/local/, тогда все файлы будут распространены не по основной файловой системе, а в /usr/local;
- —bindir=DIR — папка для размещения исполняемых файлов, должна находится в PREFIX;
- —libdir=DIR — папка для размещения и поиска библиотек по умолчанию, тоже в PREFIX;
- —includedir=DIR — папка для размещения man страниц;
- —disable-возможность — отключить указанную возможность;
- —enable-возможность — включить возможность;
- —with-библиотека — подобно enable активирует указанную библиотеку или заголовочный файл;
- —without-библиотека — подобное disable отключает использование библиотеки.
Вы можете выполнить configure без опций, чтобы использовать значения по умолчанию, но также можете вручную указать нужные пути. В нашем случае ./configure есть, и мы можем его использовать:
Во время настройки утилита будет проверять, есть ли все необходимые библиотеки в системе, и если нет, вам придется их установить или отключить эту функцию, если это возможно. Например, может возникнуть такая ошибка: no terminal library found checking for tgetent(). configure: error: NOT FOUND!
В таком случае нам необходимо установить требуемую библиотеку. Например, программа предлагает ncurses, поэтому ставим:
Приставка lib всегда добавляется перед библиотеками, а -dev — означает, что нам нужна библиотека со всеми заголовочными файлами. После удовлетворения всех зависимостей настройка пройдет успешно.
Сборка программы
Когда настройка будет завершена и Makefile будет готов, вы сможете перейти непосредственно к сборке программы. На этом этапе выполняется непосредственно преобразование исходного кода в машинный. Утилита make на основе Makefile сделает все необходимые действия:
Дальше осталось установить саму программу, если вы использовали опцию prefix, чтобы не устанавливать программу в основную файловую систему, то можно применить стандартную опцию make:
После этого программа будет установлена в указанную вами папку, и вы сможете ее использовать. Но более правильный путь — создавать пакет для установки программы, это делается с помощью утилиты checkinstall, она позволяет создавать как deb, так и rpm пакеты, поэтому может использоваться не только в Ubuntu. Вместо make install выполните:
Затем просто установите получившийся пакет с помощью dpkg:
После этого сборка программы полностью завершена и установлена, так что вы можете переходить к полноценному использованию.
Если вы устанавливали программу с помощью make install, то удалить ее можно выполнив в той же папке обратную команду:
Команда удалит все файлы, которые были скопированы в файловую систему.
Выводы
В этой статье мы рассмотрели, как выполняется компиляция программы Linux. Этот процесс может быть сложным для новичков, но в целом, все возможно, если потратить на решение задачи несколько часов. Если у вас остались вопросы, спрашивайте в комментариях!
На завершение видео о том, что такое компилятор и интерпретатор:
Источник
Unix как IDE: Компиляция
Под Unix существует множество компиляторов и интерпретаторов, но здесь мы будем обсуждать лишь gcc как средство компиляции C-кода, и коротко коснемся использования perl в качестве примера интерпретатора.
GCC — это набор компиляторов, обладающий очень почтенным возрастом и распространяемый под лицензией GPL. Он известен как инструмент работы с программами на C и C++. Свободная лицензия и повсеместная распространенность на Unix-подобных системах стали залогом его неизменной популярности, хотя есть и более современные альтернативы, использующие инфраструктуру LLVM, такие как Clang.
Основной исполняемый файл gcc лучше представлять не как компилятор в привычном понимании, а слой абстракции над множеством отдельных инструментов программирования, выполняющих парсинг кода, компиляцию, линковку и другие действия. Это значит, что с его помощью можно не просто получить работающий бинарник из кода на C, но детально исследовать все шаги этого сложного процесса, и при необходимости подстроить его под свои нужды.
Здесь я не буду обсуждать использование make-файлов, хотя они наверняка понадобятся для любого проекта сложнее, чем в один файл. Make-файлов я коснусь в следующей статье о средствах автоматизации сборки.
Компиляция и сборка объектного кода
Объектный код компилируется вот такой командой:
Если код верен, будет создан нелинкованный двоичный объектный файл под именем example.o в текущей папке, или выведены сообщения о проблемах. Заглянуть внутрь полученного файла и увидеть его содержимое на языке ассемблера можно так:
Как вариант, можно попросить gcc сразу показать итоговый ассемблерный код при помощи параметра -S:
Вывод ассемблерного кода может быть полезно совместить с выводом самого исходника, чего можно добиться, набрав:
Препроцессор
Препроцессор C (cpp) обычно используется для подключения заголовочных файлов и определения макросов. Это стандартная часть процесса компиляции gcc, но можно просмотреть генерируемый им код, вызвав cpp напрямую:
Исходный код будет выведен в конечном виде, готовым к компиляции, с замененными макросами и подстановкой включаемых внешних файлов.
Связывание объектов
Один или несколько объектных файлов могут быть связаны в соответствующий исполняемый файл:
В этом примере gcc просто вызывает ld, линковщик GNU. Команда создаст исполняемый файл по имени example .
Компиляция, сборка и связывание
Все вышеперечисленное может быть выполнено в один шаг при помощи команды:
Этот способ проще, но компиляция объектов по отдельности дает некоторый выигрыш в производительности: не нужно компилировать не изменявшийся код, но об этом мы поговорим в следующей статье.
Включение внешних файлов и связывание
Файлы C и заголовочные файлы могу быть явно включены в компиляцию при помощи параметра -l:
Аналогично, если код нужно динамически связать с уже скомпилированной системной библиотекой, доступной в одной из системных папок ( /lib или /usr/lib ), например, ncurses, этого можно добиться использованием ключа -l:
Если в процессе компиляции внешних связей много, имеет смысл внести их в переменные окружения:
Кстати, Makefile затем и создан, чтобы избавить нас от беспокойства о таких мелочах.
План компиляции
Чтобы посмотреть подробности внутренней кухни gcc, можно добавить ключ -v, и план компиляции будет выведен в стандартный поток вывода ошибок:
Если нет нужды генерировать объектные или исполняемые файлы, то для аккуратности можно использовать -###:
Очень полезно посмотреть, какие действия gcc предпринимает без нашего ведома, кроме того, так мы можем выявить нежелательные шаги при компиляции.
Расширенный вывод сообщений об ошибках
Существует возможность добавить ключи -Wall и/или -pedantic, чтобы gcc предупреждал нас о случаях, которые не обязательно являются ошибками, но могут ими быть:
Удобно включать такие опции в Makefile или в определении makeprg для Vim, так как они отлично сочетаются с окном quickfix, и помогают писать читабельный, совместимый и безошибочный код.
Профилирование процесса компиляции
Вы можете включить опцию -time, чтобы gcc отображал в тексте вывода время выполения каждого из шагов:
Оптимизация
Gcc имеет ключи оптимизации, указав которые можно попросить его создавать более эффективный объектный код и связанные бинарники за счет увеличения времени компиляции. Я считаю -O2 золотой серединой для выпускаемого кода:
Подобно любой команде Bash, все это можно вызывать прямо из Vim:
Интерпретаторы
Подход к интерпретируемому коду в Unix-системах иной. В своих примерах я буду использовать Perl, но те же принципы применимы для кода, например, на Python или Ruby.
Inline-код
Можно строку Perl-кода прямо на исполнение интерпретатору любым из перечисленных ниже способов Первый, наверное, самый простой и общеупотребительный способ работы с Perl; второй использует синтаксис heredoc, а третий — это классический конвейер Unix.
Конечно, в будничной жизни мы храним код в файле, который можно вызвать прямо вот так:
Можно проверить синтаксис кода без его выполнения с помощью ключа -c:
Порой хочется использовать скрипт подобно любому исполняемому бинарнику, не беспокоясь о том, что он из себя представляет. Для этого в скрипт добавляют первой строкой так называемый «shebang«, указывающий путь к интерпретатору, которому следует передать на исполнение данный файл.
Скрипту после этого можно ставить атрибут исполняемого файла вызовом chmod. Также хорошим тоном считается переименовать файл, убрав расширения, поскольку он теперь считается почти настоящим исполняемым файлом:
Затем файл можно вызывать напрямую, без указания интерпретатора:
Вся эта кухня так здорово работает, что многие стандартные утилиты Linux-систем, такие как adduser, в действительности являются скриптами на Perl или Python.
В следующей публикации я расскажу о методах работы с make для сборки проектов, сравнимых с привычными IDE.
Источник