На компиляцию библиотеки GLib2.0 я потратил почти день. Задача не такая уж и тривиальная. При компиляции постоянно возникали какие-то проблемы, на которые прямых ответов в сети нет, есть только некоторые намёки. Теперь хочется поделиться своим опытом и с другими. Мне будет очень приятно, если руководствуясь этой статьей у кого-нибудь получится собрать GLib2.0 сразу, не прилагая существенных усилий
Исходные данные
Сборка библиотеки GLib2.0 выполняется для процессора arm.
Уточню, что библиотека glib нужна мне для последующей сборки bluez
Для сборки нужен toolchain. Я использую toolchain, собранный для использования библиотеки glibc (думаю для сборки с uClibc отличий быть не должно)
Директория с бинарниками кросс-компилятора должна находится у вас в переменной PATH. Иными словами компилятор (например arm-unknown-linux-gnueabi-gcc) должен запускаться прямо из текущей директории.
Исходники можно взять здесь.
Я взял версию 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.
Сообщение об ошибке на этапе конфигурации:
checking for inflate in -lz... (cached) no
configure: error: *** Working zlib library and headers not found ***
Причин тут может быть три:
Библиотека zlib у вас не собрана. Для сборки glib придётся сначала собрать библиотеку zlib.
Не найдена сама библиотека 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:
Подобным образом отключаем проверку ещё в трёх местах:
После этого у меня всё собралось и успешно заработало.
Для удобства выкладываю свою версию уже собранной библиотеки 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 прошел нормально.