与来自设备SYSROOT交叉编译

时间:2019-02-02 22:30:03

标签: linux gcc arm cross-compiling

我将带有sshfs的目标设备(Beaglebone Black,ARM arch)的根目录安装到主机上的文件夹,并尝试使用GCC的--sysroot选项进行交叉编译。

但是,有一个问题 - 一些包括头文件位于目标设备上不仅位于/ usr /包括文件夹,但在它的子文件夹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 / lib / arm-linux-gnueabihf中的.so文件)的一部分放到该子文件夹的理由是什么?

当使用--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 :(得分:0)

我将发布调查结果作为答案,但会接受是否可以解决问题-我还没有解决方案

看起来目标的GCC用--enable-multiarch配置,并将其添加arm-linux-gnueabihf的子文件夹为目标名称。

关于这个主题的好书是https://wiki.debian.org/Multiarch/LibraryPathOverview

因此可能是我的问题是在从交叉编译GCC不同目标的GCC该目标名称(arm-cortexa9_neon-linux-gnueabihf {VS {1}})。我查一下,如果我能在arm-linux-gnueabihf选项来更改它,看看它是否修复该问题。

已添加:不幸的是,我无法配置crosstool-NG工具链以使用目标sysroot。在这里报告了类似的问题:http://answers.opencv.org/question/180037/cmake-cross-compiler-problem-with-pkg_check_modules-for-some-packages/

我已最终决定使用crosstool-ng图像从而安装工具链Linaro的定制对于RPI,至少它从盒编译“世界你好”。尽管该工具链似乎也来自crosstool-ng,但它是从RPi工具库中以二进制形式下载的,其配置与dockcross/linux-armv6的配置有很大不同。

现在,我尝试按照此指南进行交叉编译OpenCV:http://courses.engr.uky.edu/ideawiki/doku.php?id=resources:sop:cross_compiling_opencv_for_raspberry_pi,并在为pkg-config指定路径之后,OpenCV cmake脚本开始查看目标sysroot中已安装的库。

答案 1 :(得分:0)

实际上,我不想深入探讨您的方法,因为我认为这不是交叉编译的常见方法。 不建议使用交叉编译的方式。交叉编译应用程序有两种常用方法。

首先,使用import schedule import time def job1(): print("I'm working...") def job2(): print("I'm not working...") def job3(): print("I'll not work...") schedule.every(2).seconds.do(job1) #For Every 2 seconds schedule.every(5).seconds.do(job2) #For Every 3 Seconds schedule.every().day.at("17:28").do(job3) #Once in a day while True: schedule.run_pending() time.sleep(1) 之类的虚拟化应用程序来创建一个与嵌入式板一样的虚拟环境。您可以找到一个很好的教程here。然后,您可以将您的应用程序带到那里并进行本地编译。此解决方案的缺点是您要创建一个完整的文件系统,并且应将所有应用程序依赖项(可能会造成混淆)带入主文件系统中。

第二,您可以使用Qemu来交叉编译您的应用程序。这是另一个tutorial,我想您可以找到更多有关它的信息。

我认为,当我需要原生构建具有很多依赖关系的应用程序时,我更喜欢使用Qemu。另一方面,本机不支持它的交叉编译应用程序可能会变得非常混乱。