Компілювати програми

Існує щонайменше дві причини, з яких вам, можливо, доведеться компілювати програми для Linux самостійно: або ви не знайдете для вашого дистрибутива двійкового пакета з готовою скомпільованою потрібною програмою, або вам може знадобитися скомпілювати програму з конфігурацією, яка відрізняється від стандартної.

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

— Встановити набір компіляторів проекту GNU (gcc та gcc-c++). Вони містяться компілятори для З і З++. Про Інсталювати допоміжні інструменти, зокрема make, automake, autoconf і т. д. Ці програми потрібні для конфігурації та виконання компілювання.

— Встановити версії різних бібліотек, які призначені для розробки. Назви відповідних пакетів зазвичай закінчуються -devel (Red Hat, SUSE) або -dev (Debian, Ubuntu). Наприклад, glibc-devel або libc6-dev містять інструментальні файли для базової бібліотеки glibc. Чи знадобляться вам якісь інструментальні пакети, залежить від конкретної програми, яку ви хочете скомпілювати. Якщо компілятор або компонувальник буде видавати повідомлення про помилки, що свідчать про те, що для роботи не вистачає бібліотек, це однозначно вказує на те, що ви пропустили якийсь важливий інструментальний пакет.

Debian, Ubuntu

Метапакет визначає взаємозалежність між найважливішими інструментальними пакетами. Тому при установці build-essential автоматично встановлюються багато інших пакетів, які утворюють базову конфігурацію для розробки програм на C/C++.

Тут у модулі YaST встановлюються всі пакети схеми "Базове середовище розробки". Якщо ви збираєтеся писати програми для KDE або Gnome, встановіть добірки KDE або GNOME-DEVELOPMENT. Якщовіддаєте перевагу zypper, виконайте команду zypper install -t шаблон devel_basis або devel_kde bzw. devel_gnome.

Розпакування коду

Вихідний код зазвичай лежить в Інтернеті у вигляді архівів TAR (розширення *.tar. gz, *.tgz або *.tar.bz2). Після того як завантажуєте код, розпакуйте його в локальний каталог:

Пакети SRMP

Крім TAR-архівів існують й інші пакети, що містять саме вихідний код, з якого була скомпільована певна програма вашого дистрибутива. Такі пакети з вихідним кодом зазвичай знаходяться на FTP-серверах вашого дистрибутива. Файли з вихідним кодом для тих дистрибутивів, що працюють на основі пакетів RPM, знаходяться в пакетах SRMP з розширенням *.src.rpm. Для встановлення виконайте, як завжди, rpm -i:

Фактичне місце розташування цього коду залежить від конкретного дистрибутива: Fedora і Red Hat — це /usr/src/redhat/, а SUSE — це /usr/src/ packages/.

— SOURCES/ww.tar.xxx містить вихідний код. Розпакування TAR-архіву проводиться так, як описано вище. — SOURCES/ім'я-ххх.patch (Red Hat) або SOURCES/ім'я.dif (SUSE) містить дистрибутивно-специфічні зміни вихідного коду. Якщо ви бажаєте відповідним чином змінити (пропатчити) файли коду, виконайте таку команду:

Залежно від того, який каталог зараз поточний і яка інформація про каталог записана в патч-файлі, потрібно додатково вказати параметр -p1 (див. довідку man patch). Про SPECS/ім'я .spec містить опис пакета, що також служить для створення RPM-пакетів. (Якщо ви хочете зробити RPM-пакет із самостійно скомпільованої програми, використовуйте для цього команду rpmbuild, на якій ми докладніше зупинятися не будемо. Прочитайте man rpmbuild!)

Пакети з вихідним кодом для Debian

У дистрибутивах, побудованих на основі Debian, вихідний код знаходиться в декількох файлах, які потрібно встановити в поточний каталог, найкраще за допомогою команди apt-get source.

Тепер у поточному каталозі ви знайдете три нових файли і один каталог: Про имя_пакета .dsc містить короткий опис пакета;

- имя_пакета.orig.tar.gz містить TAR-архів з початковим вихідним кодом, написаним розробником програми; — ім'я_пакета .diff.gz включає всі зміни оригінального вихідного коду , характерні для Debian або Ubuntu; — новий каталог имя_пакета/ містить, нарешті, інформацію, вже витягнуту з имя_пакета .diff.gz, причому всі зміни з DIFF-файлу вже виконані.

Компілювання програми

Для компілювання та встановлення програм потрібні три команди, які іноді називаються «три в одному»: ./configure, make та make install (далі вони будуть описані докладніше). При цьому має бути відкритий каталог із вихідним кодом.

Сценарій configure

Це сценарій, який перевіряє, чи доступні всі необхідні програми та бібліотеки. Оскільки сценарій знаходиться в локальній папці, його потрібно виконувати як./configure. Цей сценарій адаптує файл Makefile, що містить усі команди, для компілювання та компонування різних файлів коду. У деяких (зазвичай невеликих) програмах configure може бути відсутнім. У такому випадку одразу виконуйте make.user$./configure

Команда make Вона ініціює обробку команд компілювання та компонування. Тепер ви побачите (іноді практично нескінченні) повідомлення та попередження про різні процеси компілювання, що переповнюють вікно консолі. Якщо помилок не відбувається, можете просто ігнорувати ці повідомлення. В результаті в каталозі з вихідним кодом має з'явитисявиконуваний файл ім'я.

У багатьох випадках на цьому етапі можна запускати програму (команда ./ім'я) і тестувати її. Однак зверніть увагу, що деякі служби, зокрема мережеві, потребують спеціальної конфігурації і зазвичай мають запускатися за допомогою сценаріїв Init-V!

Команда make install

На заключному етапі ми маємо забезпечити всім користувачам доступ до програми. Нам потрібно буде скопіювати файли програми та, можливо, файли бібліотек у загальнодоступні каталоги. Для цього необхідні права адміністратора. Перед виконанням make install слід переконатися, що потрібна програма ще не встановлена! В іншому випадку її попередньо потрібно деінсталювати. root# make install

Можливі проблеми

Під час компілювання програм можуть виникати різноманітні проблеми. Найчастіше вони пов'язані з відсутністю будь-яких допоміжних компілюючих інструментів чи бібліотек. Як правило, такі проблеми ідентифікує вже configure, і усунути їх зовсім не складно - потрібно просто встановити пакет, що бракує.

Ситуація ускладнюється, коли configure вимагає бібліотеку, яка недоступна у вашому дистрибутиві, або у вас немає необхідної версії бібліотеки. Тоді вам доведеться шукати в Інтернеті потрібну бібліотеку або, можливо, спершу скомпілювати бібліотеку. Що стосується складних програм, наприклад Apache або mplayer, в Інтернеті є точні посібники з компілювання, де крок за кроком описано, що і в якій послідовності необхідно встановити і скомпілювати.

Ще гірше, якщо в процесі компілювання виникає синтаксична помилка та процес компілювання обривається повідомленням про помилку. Часто причиною цього є не програмна помилка, а несумісність вашого компілятора та коду. Деякі програмиможна скомпілювати лише певною версією gcc (часто не новітньої!), тобто проблема вирішується встановленням потрібної версії компілятора. На цей випадок в Інтернеті або у файлах README, що супроводжують вихідний код, можна знайти точні вказівки.

Управління пакетами

Самостійно скомпіловані програми та бібліотеки вносять плутанину в керування пакетами. Проблема полягає в тому, що хоча програма аЬс, скомпільована вами, вже встановлена ​​в системі, база даних RPM або DEB нічого про це "не знає". Якщо тепер ви спробуєте встановити пакет xyz, що залежить від аЪс, отримайте повідомлення про помилку, оскільки, на думку системи, не виконуються міжпакетні взаємозалежності. Однак встановити пакет за допомогою rpm можна завдяки параметрам nodeps та -force.

Найкрасивіше рішення - не встановлювати програму за допомогою make install, а спочатку підготувати та встановити пакет. Для цього потрібно познайомитися з командами, що відповідають за упаковку пакетів. Загалом цей метод дуже незручний, якщо програма повинна неодноразово тестуватися і компілюватися заново.