кросс-компиляция с sysroot с устройства - PullRequest
0 голосов
/ 03 февраля 2019

Я смонтировал корневой каталог целевого устройства (Beaglebone Black, ARM arch) с помощью sshfs в папку на хосте и пытался выполнить кросс-компиляцию, используя параметр GCC --sysroot.

Но есть проблема - некоторые включаютЗаголовочные файлы находятся на целевом устройстве не только в папке / usr / include, но и в ее подпапке arm-linux-gnueabihf.То же самое есть и в папке / usr / lib / arm-linux-gnueabihf.

Образцу "Hello world" не удается скомпилировать

[gmixaz:/work] $ $CC --sysroot=/work/sysroot h.c
In file included from /work/sysroot/usr/include/stdio.h:27:0,
                 from h.c:1:
/work/sysroot/usr/include/features.h:364:25: fatal error: sys/cdefs.h: No such file or directory
 #  include <sys/cdefs.h>

, поскольку sys/cdefs.h находится в / usr / include/ arm-linux-gnueabihf, в то время как компилятор ожидает его в / usr / include

Мой вопрос: почему у меня есть эта подпапка arm-linux-gnueabihf в / usr / include?Каково было обоснование для помещения части включаемых файлов (и файлов .so в / usr / lib / arm-linux-gnueabihf) в эту подпапку?

И как мне решить эту проблему при перекрестной компиляции с -опция sysroot - нужно ли указывать подпапку с опциями компилятора -I и -L, или есть какое-то лучшее решение?Я думаю, что только --sysroot должно быть достаточно, но это не так.Это «специально»?

После добавления папок в командную строку у меня появилась другая проблема:

[gmixaz:/work] 1 $ $CC --sysroot /work/sysroot3 -I /work/sysroot3/usr/include/arm-linux-gnueabihf -L /work/sysroot3/usr/lib/arm-linux-gnueabihf h.c
/usr/xcc/arm-cortexa9_neon-linux-gnueabihf/lib/gcc/arm-cortexa9_neon-linux-gnueabihf/6.3.1/../../../../arm-cortexa9_neon-linux-gnueabihf/bin/ld.bfd: cannot find crt1.o: No such file or directory
/usr/xcc/arm-cortexa9_neon-linux-gnueabihf/lib/gcc/arm-cortexa9_neon-linux-gnueabihf/6.3.1/../../../../arm-cortexa9_neon-linux-gnueabihf/bin/ld.bfd: cannot find crti.o: No such file or directory
collect2: error: ld returned 1 exit status

Что происходит?При сборке crosstool-NG я пытался сопоставить данные целевой арки.Кросс-компиляция GCC на хосте:

[gmixaz:/work] 1 $ $CC -v
Using built-in specs.
COLLECT_GCC=/usr/xcc/arm-cortexa9_neon-linux-gnueabihf/bin/arm-cortexa9_neon-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/usr/xcc/arm-cortexa9_neon-linux-gnueabihf/libexec/gcc/arm-cortexa9_neon-linux-gnueabihf/6.3.1/lto-wrapper
Target: arm-cortexa9_neon-linux-gnueabihf
Configured with: /dockcross/crosstool/toolchain/.build/src/gcc-linaro-6.3-2017.02/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=arm-cortexa9_neon-linux-gnueabihf --prefix=/usr/xcc/arm-cortexa9_neon-linux-gnueabihf --with-sysroot=/usr/xcc/arm-cortexa9_neon-linux-gnueabihf/arm-cortexa9_neon-linux-gnueabihf/sysroot --enable-languages=c,c++ --with-cpu=cortex-a8 --with-fpu=neon --with-float=hard --with-pkgversion='crosstool-NG ' --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --disable-libmpx --with-gmp=/dockcross/crosstool/toolchain/.build/arm-cortexa9_neon-linux-gnueabihf/buildtools --with-mpfr=/dockcross/crosstool/toolchain/.build/arm-cortexa9_neon-linux-gnueabihf/buildtools --with-mpc=/dockcross/crosstool/toolchain/.build/arm-cortexa9_neon-linux-gnueabihf/buildtools --with-isl=/dockcross/crosstool/toolchain/.build/arm-cortexa9_neon-linux-gnueabihf/buildtools --enable-lto --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-plugin --enable-gold --with-libintl-prefix=/dockcross/crosstool/toolchain/.build/arm-cortexa9_neon-linux-gnueabihf/buildtools --disable-multilib --with-local-prefix=/usr/xcc/arm-cortexa9_neon-linux-gnueabihf/arm-cortexa9_neon-linux-gnueabihf/sysroot --enable-long-long
Thread model: posix
gcc version 6.3.1 20170109 (crosstool-NG ) 

GCC на цели:

debian@beaglebone:~$ cc -v
Using built-in specs.
COLLECT_GCC=cc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Debian 6.3.0-18+deb9u1' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-6 --program-prefix=arm-linux-gnueabihf- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --enable-default-pie --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-armhf/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-armhf --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-armhf --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) 

Чего мне не хватает в конфигурации набора инструментов?

ДОБАВЛЕНО: Я обнаружил, что следующий файл отвечает за размещение библиотек в этой подпапке на цели:

debian@beaglebone:~$ cat /etc/ld.so.conf.d/arm-linux-gnueabihf.conf
# Multiarch support
/lib/arm-linux-gnueabihf
/usr/lib/arm-linux-gnueabihf

Теперь я пытаюсь понять, как правильно прикрепить эти папки к кросс-компилятору.

Кроме того, я предполагаю, что нечто подобное установлено для включаемых заголовочных файлов, просто интересно, где этот параметр для GCC на цели?

ДОБАВЛЕНО: Подобная проблема обсуждалась для кросса RPiсборник: https://github.com/raspberrypi/tools/issues/42

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

На самом деле, я не хочу копаться в вашем пути, потому что я думаю, что это не распространенный способ кросс-компиляции.Способ кросс-компиляции не предлагается.Существует два распространенных способа кросс-компиляции приложения.

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

Во-вторых, вы можете использовать Linaro toolchains для кросс-компиляцииваше приложение.Вот еще один учебник , и я думаю, что вы можете найти больше об этом.

По моему мнению, я предпочитаю использовать Qemu, когда мне нужно создать приложение изначально, которое имеет много зависимостей.С другой стороны, кросс-компиляция приложений, которые не поддерживают его, может привести к путанице.

0 голосов
/ 03 февраля 2019

Я публикую результаты своего исследования в качестве ответа, но приму, если это решит проблему - у меня пока нет решения)

Похоже, что GCC цели был настроен с -enable-multiarch, и он добавляет подпапку arm-linux-gnueabihf для этого целевого имени.

Хорошее чтение по теме: https://wiki.debian.org/Multiarch/LibraryPathOverview

Так что, вероятно, моя проблема заключается в том, что имя цели в кросс-компиляции GCCотличается от GCC цели (arm-cortexa9_neon-linux-gnueabihf против arm-linux-gnueabihf).Я проверю, могу ли я изменить его в параметрах crosstool-NG, и посмотрю, исправит ли это проблему.

ДОБАВЛЕНО: К сожалению, я не смог настроить crosstool-ng набор инструментов для использованияцелевой системный корень.О подобной проблеме сообщалось здесь: http://answers.opencv.org/question/180037/cmake-cross-compiler-problem-with-pkg_check_modules-for-some-packages/

Я наконец-то решил использовать dockcross/linux-armv6 образ, который устанавливает набор инструментов linaro, настроенный для RPi, по крайней мере, он собирает «hello world» из коробки.Хотя инструментальная цепочка, кажется, также получена из crosstool-ng, она загружается в двоичном виде из репозитория инструментов RPi, и ее конфигурация значительно отличается от конфигурации для dockcross/linux-armv7.

Теперь я пытаюсь кросс-компилировать OpenCVсогласно этому руководству: http://courses.engr.uky.edu/ideawiki/doku.php?id=resources:sop:cross_compiling_opencv_for_raspberry_pi и после указания путей для pkg-config, скрипт cmake OpenCV начал видеть установленные библиотеки в sysroot цели.

...