当前位置: 首页 > 知识库问答 >
问题:

从设备使用sysroot进行交叉编译

汪弘光
2023-03-14

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

但是有一个问题--有些include头文件不仅位于目标设备的/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?将部分include文件(以及/usr/lib/arm-linux-gnueabihf中的.so文件)放入该子文件夹的理由是什么?

[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
[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-html" target="_blank">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

共有1个答案

田俊爽
2023-03-14

我张贴我的调查结果作为答案,但如果它解决了问题,我将接受--我还没有解决方案)

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

关于这个主题的好阅读是https://wiki.debian.org/multiarch/librarypathoverview

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

 类似资料:
  • 我试图遵循各种建议,但它们没有我的特定错误消息:crt2.o:crtexe.c:(.rdata$.refptr.__onexitend[.refptr.__onexitend]+0x0):未定义对`__onexitend'的引用collect2:error:ld返回1退出状态 希望得到一些东西,但它爆炸了。输出如下所示:/usr/bin/x86_64-w64-mingw32-ld://home/v

  • 正在检查CC的已解析符号链接。..没有符号链接配置:C编译器(位于/mnt/d/ubuntu/ndk/build/tools/toolchain/bin/aarch64-linux-android21-clang)似乎不是所需的gcc编译器。configure:使用--version运行的结果是:“”configure:error:需要gcc编译器。尝试设置--with-tools-dir。使用结

  • LiteIDE 通过使用环境配置文件来支持 go 语言的交叉编译,对于 windows 和 linux 下相对简单,对于 macOS 可能会复杂一些, 本文以 macOS 交叉编译 windows-386 可执行文件为例,简要介绍如何在 LiteIDE 中配置和实现交叉编译功能。 交叉编译环境选择和配置 首先选择环境,在工具栏环境选择中选择 cross-win32 切换至 windows-386

  • 安装gcc进行ARM交叉编译的问题 我一直在尝试安装gcc-arm-linux-fnueabi包,并且通过几种不同的方法安装了几次,但似乎总是缺少includes目录中的C++文件夹。 我的机器:32&64位英特尔i5处理器,在华硕上运行Ubuntu 14.10 目标设备:Beaglebone(黑色)

  • 问题内容: 我正在尝试在OSX上交叉编译go应用程序,以为Windows和Linux构建二进制文件。我已经阅读了所有可以在网上找到的东西。我发现的最接近的示例已发布(除了有关go- nuts邮件列表的许多未完成的讨论之外): http://solovyov.net/en/2012/03/09/cross-compiling- go/ 但它不适用于我的安装。我去了1.0.2。由于1.0.2是最近的版

  • 问题内容: 我想使用Linux x86_64主机交叉编译Windows x86_64目标的Qt库(最终是我的应用程序)。我感觉自己已经接近了,但是我可能对该过程的某些部分有一个根本性的误解。 首先,在我的Fedora机器上安装所有mingw软件包,然后修改qmake.conf文件以适合我的环境。但是,我似乎对Qt:和的一些看似显而易见的配置选项感到困惑。Qt文档说应该是主机体系结构(要在其中进行编