--sysroot=$SDKTARGETSYSROOT 的含义?
meaning of --sysroot=$SDKTARGETSYSROOT?
有一些非常令人费解的事情(或者对我来说听起来很奇怪)。希望你们能有更清楚的解释
一直在使用 Yocto Distribution 中的 environment-setup-file (environment-setup-aarch64-poky-linux) 为 arm 交叉编译文件。我理解是设置环境(使用source environment-setup-file)
它包含
- SDKTARGETSYSROOT(我的理解是具有代表性的最小目标,它保存着交叉编译代码所需的头文件和库文件)
- PATH(有点像您自己环境中的 PATH 用法,但由于它与目标有关而有所不同)
让我感到困惑的是工具链的位置。不是应该在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 在那个目录之外?,因为那个目录只包含目标架构的文件(因此 SDKTARGETSYSROOT
,SDK
:对于 SDK,TARGET
:意味着目标 arch,SYSROOT
:要使用的 sysroot),而 GCC 不是。
GCC 在您的 HOST 中编译为 运行,因此它不属于该目录,这正是您看到 GCC 实际安装路径的 x86_64-pokysdk-linux
部分的原因,你的HOST三元组是64位x86架构,是poky(Yocto)搭建的SDK,它的OS是Linux.
有一些非常令人费解的事情(或者对我来说听起来很奇怪)。希望你们能有更清楚的解释
一直在使用 Yocto Distribution 中的 environment-setup-file (environment-setup-aarch64-poky-linux) 为 arm 交叉编译文件。我理解是设置环境(使用source environment-setup-file)
它包含
- SDKTARGETSYSROOT(我的理解是具有代表性的最小目标,它保存着交叉编译代码所需的头文件和库文件)
- PATH(有点像您自己环境中的 PATH 用法,但由于它与目标有关而有所不同)
让我感到困惑的是工具链的位置。不是应该在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 在那个目录之外?,因为那个目录只包含目标架构的文件(因此 SDKTARGETSYSROOT
,SDK
:对于 SDK,TARGET
:意味着目标 arch,SYSROOT
:要使用的 sysroot),而 GCC 不是。
GCC 在您的 HOST 中编译为 运行,因此它不属于该目录,这正是您看到 GCC 实际安装路径的 x86_64-pokysdk-linux
部分的原因,你的HOST三元组是64位x86架构,是poky(Yocto)搭建的SDK,它的OS是Linux.