--sysroot=$SDKTARGETSYSROOT 的含义?

meaning of --sysroot=$SDKTARGETSYSROOT?

有一些非常令人费解的事情(或者对我来说听起来很奇怪)。希望你们能有更清楚的解释

一直在使用 Yocto Distribution 中的 environment-setup-file (environment-setup-aarch64-poky-linux) 为 arm 交叉编译文件。我理解是设置环境(使用source environment-setup-file)

它包含

让我感到困惑的是工具链的位置。不是应该在SDKTARGETSYSROOT中找到吗(工具链是别人设置的,SDKTARGETSYSROOT= /opt/fsl-imx-xwayland/4.14-sumo/environment-setup-aarch64-poky-linux)?我发现我的 aarch64-poky-linux-gcc 位于 SDKTARGETSYSROOT 目录之外的目录中(尽管 gcc 位于 PATH, /opt/fsl-imx-xwayland/4.14-sumo/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux)

这样做有道理吗?我一直在编写代码,但想了解为什么会这样?

谢谢

这与跨加拿大编译器(在本例中为 GCC)而不是 Yocto 有更多关系,Yocto 项目使用传递给 GCC 的 --sysroot 参数连接其编译器逻辑: https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html

这告诉 GCC 将作为 --sysroot 传递的内容视为目标上典型编译的 sysroot,例如通常 GCC 希望在 /usr/include 中找到头文件或在 /usr/lib 中找到库,如果我们传递 --sysroot=/foo/ 那么它会自动分别查看 /foo/usr/include/foo/usr/lib

Yocto 项目中的工具链脚本使用 --sysroot=SDKTARGETSYSROOT 传递安装 SDK 的目录,因此它找到正确的头文件和库以便能够从 SDK 交叉编译,有关更多信息: https://git.yoctoproject.org/poky/tree/meta/classes/toolchain-scripts.bbclass

现在为什么 GCC 在那个目录之外?,因为那个目录只包含目标架构的文件(因此 SDKTARGETSYSROOTSDK:对于 SDK,TARGET:意味着目标 arch,SYSROOT:要使用的 sysroot),而 GCC 不是。 GCC 在您的 HOST 中编译为 运行,因此它不属于该目录,这正是您看到 GCC 实际安装路径的 x86_64-pokysdk-linux 部分的原因,你的HOST三元组是64位x86架构,是poky(Yocto)搭建的SDK,它的OS是Linux.