Программа кросс-компиляции Apache Thrift для armhf

Я на x86 пытаюсь перекрестно скомпилировать экономную программу apache, написанную на C++ для armhf. Я установил gcc-arm-linux-gnueabihf и g++-arm-linux-gnueabihf через apt-get, но когда я использую их для компиляции моей программы, я получаю

skipping incompatible /usr/local/lib/libthrift.so when searching for -lthrift

поэтому я попытался настроить thrift для компиляции libthrift.so, совместимого с armhf, с помощью этого руководства, поэтому в bash:

./configure CXX=arm-linux-gnueabihf-g++ CC=arm-linux-gnueabihf-gcc --prefix=/BBB/thrift --host=arm-linux-gnueabihf --with-cpp CFLAGS="-g -O2 -I$DIR/include" LDFLAGS="-L$DIR/lib

но потом я получил:

checking for libevent >= 1.0... configure: error: in 'home/xic/thrift-0.9.0': configure: error: cannot run test program while cross compiling

поэтому я успешно скомпилировал libevent, но это все равно не сработало. Глядя в экономию config.log, я вижу

/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lfl collect2: ld returned 1 exit status

поэтому, видимо, мне также нужно кросс-компилировать flex. Действительно ли это лучший способ сделать это, или есть более быстрые/простые способы?

пс. Я делаю кросс-компиляцию для Beaglebone Black, который использует armhf.


person woojoo666    schedule 23.07.2013    source источник


Ответы (2)


Thrift 0.9.0 сломан для кросс-компиляции - в тестовых сценариях Autoconf есть множество статических путей.

В их Jira есть ошибка по этому вопросу, но дело не продвинулось очень далеко (в основном спрашивают, установил ли я --includedir всех вещей... (Подсказка: кросс-компиляция не использует вас, чтобы возиться с это в конфигурации Autotools - и первое, что они должны были сделать, это искать фиксированные пути вне хоста))

Вы не можете отключить сборку PHP, которая еще больше облажается. Позор, правда, мне как бы нужен был универсальный магазин для этого, а Google и сообщество в целом отказались от этого (RPC - это шутка ... сколько разных реализаций - и ни одна из них не поддерживает C / C++/Python/C# одновременно совместим...).

person Svartalf    schedule 17.08.2013
comment
Спасибо. В итоге я начал компилировать на beaglebone, но поскольку сайт apache не дает имен пакетов для opkg (они используют apt-get), мне пришлось искать их по отдельности. Документации RPC серьезно не хватает... - person woojoo666; 21.08.2013
comment
Да, они только недавно работали над исправлением хотя бы части ошибок при кросс-компиляции (если бы они только перестали использовать Autotools... вздох...) за последние три недели, судя по письмам, которые я недавно получил. ошибка, которую я подал. У него есть потенциал, но он не получает должного ухода, включая документацию. - person Svartalf; 25.03.2014

В моей системе я установил libfl, выполнив следующую команду, которая должна быть проще, чем ручная кросс-компиляция flex.

sudo xapt -a armhf -m libfl-dev

Чтобы решить проблему cannot run test program while cross compiling, вы можете либо собрать Thrift без поддержки libevent (если это вариант для вас), передав --without-libevent в configure, либо изменить aclocal/ax_lib_event.m4, заменив использование AC_RUN_IFELSE на AC_LINK_IFELSE. Обратите внимание, что вам придется внести аналогичные изменения в aclocal/ax_lib_zlib.m4, если только вы не передадите --without-zlib в configure. Не забудьте запустить autoconf после изменения файлов в aclocal.

После внесения этих изменений вы, вероятно, столкнетесь со следующими ошибками компиляции:

/usr/arm-linux-gnueabihf/include/c++/4.6.3/cstdlib:119:11: ошибка: '::malloc' не был объявлен /usr/arm-linux-gnueabihf/include/c++/4.6.3 /cstdlib:127:11: ошибка: '::realloc' не был объявлен

ИМО, самый простой способ исправить это — удалить следующие строки из configure.ac:

AC_FUNC_MALLOC
AC_FUNC_REALLOC

Опять же, вам придется запустить autoconf после удаления строк из configure.ac.

Наконец, вы можете повторно запустить configure с выбранными параметрами. В моей системе я запустил:

./configure --host=arm-linux-gnueabihf --with-cpp --without-tests \
   --without-qt4 --without-c_glib --without-ruby --without-python

Вам понадобится опция --without-tests, чтобы избежать проблем, вызванных попыткой сборки запустить тестовые двоичные файлы armhf на вашей машине сборки x86.

Я передал остальные параметры --without-*, чтобы не устанавливать дополнительные зависимости. Если вам не требуется поддержка QT, Glib, Ruby и Python, я рекомендую вам сделать то же самое, чтобы упростить сборку.

person Tim    schedule 16.08.2013
comment
И для последней экономии отключите тесты --enable-tests=no - person wilbeibi; 20.01.2016
comment
В то время, когда я пытался это сделать, это не работало правильно для --without-tests. Они исправили это в более поздних версиях, как указано @wilbeibi. - person Svartalf; 21.05.2019