Крос-компіляція під arm - midnight commander, особова картка tetraquark

Крос-компіляція під arm - midnight commander, особова картка tetraquark

Тема крос-компіляції безсумнівно важлива. В процесі роботи над різними проектами, цілком можливо, що з'явиться необхідність в компіляції програми під різні архітектури без прямого доступу до пристроїв на потрібній архітектурі. Найпростіший приклад - скомпілювати файловий менеджер для машинки Raspberry Pi, але робити це безпосередньо на «пирозі» затія, що припускає витратити купу часу на очікування (не враховуючи різні проблеми і помилки, які, повірте, будуть).

Тому я присвячу пару записів на дану тему, оскільки подібні завдання недавно виникали у мене, з якими мені все-таки вдалося впорається. І мені б хотілося поділитися отриманим досвідом з громадськістю.

Власне, яке завдання, які вихідні дані, які кошти. Завдання - скомпілювати відомий файловий менеджер Midnight Commander (mc) під систему з архітектурою ARM. У наших руках комп'ютер з процесором Intel, з операційною системою Ubuntu 14.04. Як компілятора будемо використовувати пакет gcc-4.7-arm-linux-gnueabi, який відмінно перебуває на репозиторіях. Вихідний матеріал - вихідні коди необхідних бібліотек і код самого mc.

Спершу почнемо з простого - установка інструментів для крос-компіляції. Відбувається все це дуже просто:

# Apt-get install gcc-4.7-arm-linux-gnueabi
# Apt-get install gcc-arm-linux-gnueabi
Це справа працює як gcc, викликати компілятор можна так: arm-linux-gnueabi-gcc. Всі можливості дивіться тут: man arm-linux-gnueabi-gcc.

Крок 2 - завантажуємо вихідні. На будуть потрібні наступні вихідні:

Крок 3 - підготовка до крос-компіляції. Зараз нам необхідно підготувати скачані вихідні до компіляції. Але спочатку один нюанс - мені так і не вдалося скомпілювати mc з відносними шляхами. Хто не в курсі, проблема ось у чому - при компіляції певних бібліотек, їм необхідно вказувати шляхи до вже скомпільованих залежних бібліотек. Власне, при компіляції самого mc потрібно згодовувати йому вищенаведені ліби. Вказавши повні шляху (а конфігураційні скрипти чомусь вимагають вказувати саме абсолютні шляхи), ваш mc запуститься тільки за такими шляхами файлової системи, в яких все було скомпілювати. Наприклад, якщо ви вирішили все зібрати тут: / home / username / arm_mc, то ваша програма на іншому комп'ютері запуститься лише тільки в / home / username / arm_mc, за умови що все залежні бібліотеки також знаходяться в тих місцях, на які вказувалося при крос -компіляціі. Це проблема, яку я не зміг вирішити, буду дуже вдячний, якщо хто небудь розповість, як правильно це зробити.

Тому для нашого випадку ми скористаємося найпростішим варіантом: все компілювати будемо сюди / tmp / mc_build / builds, і запускати всі будемо також тим шляхом (якщо ви зважилися робити так, то не забувайте особливість каталогу tmp - після перезавантаження системи, даний каталог чиститься ).

Тому робимо наступне:

В каталог / tmp / mc_build / sources кладемо наш архів mc_src.tar.gz і виконуємо разархивацию в даний каталог вмісту всіх архівів руками, або так (перед виконанням спочатку перейдіть в каталог з архівом):

$ Tar -xf mc_src.tar.gz for f in * .tar *; do tar xf $ f; done

Крок 4 - компіляція. Процес компіляції насправді дуже простий, за нас, по суті, розробники вже подбали, створили скрипти конфігурації і make-файли, які всю брудну роботу виконують самі. Від нас лише потрібно правильно надати необхідні залежності і згодувати скриптів потрібні прапори і параметри. Як це робити будемо ми: необхідно буде створювати виконуваний bash-скрипт в корені каталогу компільованої бібліотеки, прописувати в даний скрипт потрібні команди і виконувати цей скрипт. Власне, займемося даними, досить рутинним, процесом. Для першої бібліотеки я розпишу повну послідовність команд, для решти я приведу лише тексти bash-скриптів.

Створюємо файл скрипта в корені:

Копіюємо в цей файл наступний текст:

CHECK_LIBS = "-L / tmp / mc_build / builds / build_check-0.10.0 / lib / -lcheck" \

GLIB_CFLAGS = "-I / tmp / mc_build / builds / build_glib-2.44.1 / include / glib-2.0 -I / tmp / mc_build / builds / build_glib-2.44.1 / lib / glib-2.0 / include" \

GLIB_LIBS = "-L / tmp / mc_build / builds / build_glib-2.44.1 / lib -lglib-2.0" \

GMODULE_CFLAGS = "-I / tmp / mc_build / builds / build_glib-2.44.1 / include / glib-2.0 -I / tmp / mc_build / builds / build_glib-2.44.1 / lib / glib-2.0 / include" \

GMODULE_LIBS = "-L / tmp / mc_build / builds / build_glib-2.44.1 / lib / glib-2.0 -lgmodule-2.0" \

-- host = arm - linux - gnueabi \

-- prefix = / tmp / mc_build / builds / build_mc - 4.8.14 \

-- enable - static = yes \

-- with - screen = ncurses \

-- with - ncurses - includes = "/tmp/mc_build/builds/build_ncurses-5.9/include" \

-- with - ncurses - libs = "/tmp/mc_build/builds/build_ncurses-5.9/lib"

sudo make install

У разі, якщо у вас після все вище зробленого з'явилася татко /tmp/mc_build/builds/build_mc-4.8.14 - вітаю, у вас, напевно, вдалася крос-компіляція файлового менеджера Midnight Commander під архітектуру ARM.

Далі дії прості - завантажуємо каталог / tmp / mc_build / builds на потрібну систему за однойменним шляху, і запускаємо mc: /tmp/mc_build/builds/build_mc-4.8.14/bin/mc. Все повинно працювати.

Крос-компіляція під arm - midnight commander, особова картка tetraquark

Для знавців - в даному прикладі в якості графічної бібліотеки використовувалася бібліотека ncurses, оскільки це простіше в плані збирання. Є варіант використовувати бібліотеку slang (для даного прикладу версії 2.3.0), але це більш складне завдання, оскільки slang має злегка більше залежностей. Можете спробувати, у мене поки не вийшло.

Дякую всім, ставте лайки, підписуйтесь на мій канал, всім пока!

Крос-компіляція під ARM - OpenSSH

22 thoughts on "Крос-компіляція під ARM - Midnight Commander"

І ще. C ncurses проблема - не Компільо то не може знайти заголовки то libs. Компілював без нього. Ще. Він не компілюється без бібліотек slang. Потрібно збирати і її.

Сугак Віктор says:

Добрий день. Підкажіть новачкові. Як Ви визначаєте що ще потрібно компілювати для потрібної вам програми. Ну, чому для mc будуть потрібні ще п'ять початкових кодів?

Сугак Віктор says:

Дякуємо.
А що ось ці три рядки означають
#! / Bin / bash
ARCH = arm \
CC = arm-linux-gnueabi-gcc ./configure \
Чому не можна просто ввести

$ Arm-linux-gnueabi-gcc (ім'я файлу исходника) -o (ім'я виконавчого файлу)

Вибачте за дурні питання, я з лінуксом раніше справа не мав

Сугак Віктор says: