Введение
На компиляцию библиотеки GLib2.0 я потратил почти день. Задача не такая уж и тривиальная. При компиляции постоянно возникали какие-то проблемы, на которые прямых ответов в сети нет, есть только некоторые намёки. Теперь хочется поделиться своим опытом и с другими. Мне будет очень приятно, если руководствуясь этой статьей у кого-нибудь получится собрать GLib2.0 сразу, не прилагая существенных усилий
Исходные данные
Сборка библиотеки GLib2.0 выполняется для процессора arm.
Уточню, что библиотека glib нужна мне для последующей сборки bluez
Для сборки нужен toolchain. Я использую toolchain, собранный для использования библиотеки glibc (думаю для сборки с uClibc отличий быть не должно)
Директория с бинарниками кросс-компилятора должна находится у вас в переменной PATH. Иными словами компилятор (например arm-unknown-linux-gnueabi-gcc) должен запускаться прямо из текущей директории.
Где взять исходники библиотеки GLib2.0
Исходники можно взять здесь.
Я взял версию glib-2.24.2. Самую новую версию брать не советую, у меня собрать её не получилось. Версию ниже 2.24 тоже брать не советую, там отсутствуют некоторые функции, необходимые для сборки bluez
Скрипт сборки
Для меня удобней написать отдельный сборочный скрипт (чем запускать команды непосредственно в консоли).
Итак, создаём файл crosscompile.sh.
Добавляем права на запуск (команда chmod +x crosscompile.sh)
Добавляем туда строки:
SYS_ROOT="${HOME}/programs/newArm2/toolchain/my_system/sys-root"
export CFLAGS="-I${SYS_ROOT}/usr/include"
export LDFLAGS="-L${SYS_ROOT}/lib"
./configure \
--prefix=/home/vit/programs/newArm2/compiled/glib \
--host=arm-unknown-linux-gnueabi \
&&make && make install
Пояснения
SYS_ROOT - путь к файловой системе хоста (она должна быть создана при помощи toolcain).
C_FLAGS - путь к каталогу с заголовочными файлами для кросс-компиляции
LDFLAGS - здесь указывается каталог, в котором лежат библиотеки, скомпилированные для arm
--prefix это путь, куда будет установлена библиотека glib
--host указывает на префикс кросс-компилятора. Нужно заменить его на ваш компилятор. Иногда я встречал прямое указание компилятора, линкера и других утилит, например СС=arm-unknown-linux-gnueabi-gcc LD=arm-unknown-linux-gnueabi-ld. Работать будет, но этого делать не надо, для этого вы и указываете параметр --host, а нужное название команды подставляется в конец автоматически
Сборка
Для сборки достаточно выполнить:
./crosscompile.sh
Последующая установка
Собранная библиотека находится в некой папке $HOME/programs/newArm2/compiled/glib. Чтобы добавить её в вашу будущую систему, необходимо вручную скопировать все файлы в папку sys-root вашего тулчейна, ту самую, которую вы указали в переменной SYS_ROOT.
Возможные проблемы
Не найдены файлы библиотеки zlib (zlib.h или libzlib.so)
Сообщение об ошибке на этапе конфигурации:
checking for inflate in -lz... (cached) no
configure: error: *** Working zlib library and headers not found ***
Причин тут может быть три:
Причина 1:
Библиотека zlib у вас не собрана. Для сборки glib придётся сначала собрать библиотеку zlib.
Причина 2:
Не найдена сама библиотека zlib, собранная для arm.
Решение уже описывалось при сборке библиотеки dbus.
Вкратце напомню решение. Необходимо сделать символическую ссылку в sys_root/lib на библиотеку zlib, установленную в sys_root/usr/lib:
ln -s ../usr/lib/libz.so libz.so
Причина 3:
Неправильно прописан путь к директории с заголовочными файлами. Попробуйте проверить правильность пути, указанного в CFLAGS, и проверить лежит ли по этому пути файл zlib.h.
Если это не помогло, то попробуйте задать директорию для поиска заголовочных файлов с помощью переменной CROSS_INCLUDE_DIR, как это сделано при сборке dbus
Невозможно запустить тестовую программу при кросс компиляции
Сообщение на этапе конфигурации выглядит следующим образом:
checking for growing stack pointer...
configure: error: in `/home/vit/programs/newArm2/glib-2.24.2':
configure: error: cannot run test program while cross compiling
See `config.log' for more details.
Честно говоря, как правильно решить эту проблему я не знаю.
Встречал предложение заново пересоздать configure с помощью утилиты autoconf, но мне это не помогло.
Представляю свой корявый и неправильный, но рабочий вариант решения. Если кто-то знает нормальное решение этой проблемы, оставьте, пожалуйста, комментарии (снизу статьи).
Итак, решение заключается в том, чтобы в определённых местах убрать все проверки на кросс-компиляцию. Делается это следующим образом:
Открываем файл configure (мне удобнее всего для этого использовать редактор, встроенный в Midnight Commander [команда mc]). Находим там строку 'checking for growing stack pointer'. Ниже находим саму проверку
if test "$cross_compilling" = yes ; then:
Заменяем, например, на
if test "$cross_compilling__" = yes ; then:
Подобным образом отключаем проверку ещё в трёх местах:
- checking for preceeding underscore in symbols
- checking for posix getpwuid_r
- checking for posix getgrgid_r
После этого у меня всё собралось и успешно заработало.
Скачать библиотеку glib2.0 для ARM
Для удобства выкладываю свою версию уже собранной библиотеки GLib2.0 для ARM.
Библиотека была собрана с использованием glibc, при использовании в системе с uClibc работать не будет.
Извините, файл будет добавлен немного позже.
создаем файл arm-linux.cache с содержимым:
glib_cv_stack_grows=no
glib_cv_uscore=no
ac_cv_func_nonposix_getpwuid_r=yes
ac_cv_func_nonp osix_getgrgid_r =yes
И для configure указываем этот файл при помощи --cache-file=ar m-linux.cache. После чего все должно собраться на ура. Не забываем про ключик --enable-shared=yes.
решение нашел тут: http://3month-of-life.blogspot.jp/2011/05/building-mc-for-arm-mc-arm.html
Действительно невозможно это сделать.
Поэтому надо подсказать конфигу ответ на вопросы.
Делается так:
glib_cv_stack_grows=no
glib_cv_uscore=no
ну или yes зависит от того надо оно вам или нет.
Как я понял они запускаются когда не указано явно в cache-файле (--cache-file=a rm-linux.cache) возможности целевой архитектуры.
Для решения этого трабла я делал так:
1. есть сообщение: checking for posix getgrgid_r... configure: error: in `path2workdir':
configure: error: cannot run test program while cross compiling...
2. в фале ./configure находил getgrgid_r - там ниже идет тестовая программа которая должна собраться для целевой архитектуры, собирал, запускал ее на АРМ. Если все ок - то ниже находил переменную кэша (cache varables)
3. в приведенном примере это ac_cv_func_posi x_getgrgid_r, и если прожка собралась и заработала =yes иначе =no и эту строку в файл arm-linux.cache добавлял.
- Как то так...
./configure прошел нормально.