gpt4 book ai didi

linux - 从设备与 sysroot 交叉编译

转载 作者:太空狗 更新时间:2023-10-29 12:39:15 58 4
gpt4 key购买 nike

我使用 sshfs 将目标设备(Beaglebone Black、ARM arch)的根安装到主机上的一个文件夹,并尝试使用 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

我的问题是为什么我在/usr/include 中有子文件夹 arm-linux-gnueabihf?将部分包含文件(和/usr/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 on target 的设置在哪里?

已添加:针对 RPi 交叉编译讨论的类似问题:https://github.com/raspberrypi/tools/issues/42

最佳答案

我发布了我的调查结果作为答案,但如果它解决了问题我会接受 - 我还没有找到解决方案)

目标的 GCC 似乎配置了 --enable-multiarch,并为该目标名称添加了 arm-linux-gnueabihf 子文件夹。

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

所以我的问题可能是交叉编译 GCC 中的目标名称与目标 GCC 中的目标名称不同(arm-cortexa9_neon-linux-gnueabihf vs arm-linux-gnueabihf).我会检查是否可以在 crosstool-NG 选项中更改它,看看它是否能解决问题。

添加:不幸的是,我无法配置crosstool-ng 工具链来使用目标系统根目录。此处报告了类似问题:http://answers.opencv.org/question/180037/cmake-cross-compiler-problem-with-pkg_check_modules-for-some-packages/

我最终决定使用安装为 RPi 定制的 linaro 工具链的 dockcross/linux-armv6 图像,至少它从 box 编译“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 指定路径后,OpenCV cmake 脚本开始在目标的 sysroot 中查看已安装的库。

关于linux - 从设备与 sysroot 交叉编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54498140/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com