7

多亏了 crosstool-ng,我有一个可以工作的交叉编译器工具链 :) -- 然而,crosstool-ng 的文档非常稀少,而且我对交叉编译是全新的。我认为,在这种情况下,特定的主机和目标并不重要。

我有一些关于目录结构的基本问题。工具链安装到以目标命名的目录中。里面是一组目录:

arm-unknown-linux-gnueabi
bin
include
lib
libexec
share

我认为这是针对实际的交叉编译器位,因为 bin/ 中的编译器确实为此目的工作。注意里面有一个 arm-unknown-linux-gnueabi/ 目录,即里面的路径是../arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi. 里面还有一棵树:

bin
debug-root
include
lib
lib32
lib64
sysroot

lib* 目录是指向 sysroot/ 的符号链接。bin 中的东西似乎与父目录 /bin 中的交叉编译工具集相同:

> bin/gcc -v
Using built-in specs.
COLLECT_GCC=./gcc
Target: arm-unknown-linux-gnueabi
Configured with: /usr/x-tool/.build/src/gcc-4.7.2/configure 
--build=x86_64-build_unknown-linux-gnu 
--host=x86_64-build_unknown-linux-gnu 
--target=arm-unknown-linux-gnueabi

所以我的第一个问题是:这些是干什么用的?这个目录是干什么用的?

那么我的第二个问题是:应该如何使用 sysroot/ ?它显然是用于目标平台原生的支持库,所以我假设如果我正在构建这样一个库,我应该将它用作--prefix,尽管它与使用父目录相同,因为 lib* 是符号链接的......这个带有 bin 和符号链接到 sysroot 的“中间目录”令人困惑。我相信(某些)autotools 样式的包可以配置为“--with-sysroot”。 那有什么意义

4

2 回答 2

5

对于您的第一个问题,作为工具链安装目录:

  • bin/arm-unknown-linux-gnueabi-gcc
  • arm-unknown-linux-gnueabi/bin/gcc

它们是相同的,确实是硬链接。

您可以通过 CC=arm-unknown-linux-gnueabi-gcc 使用 arm-unknown-linux-gnueabi-gcc,例如

export PATH=<toolchain installed dir>/bin:$PATH
CC=arm-unknown-linux-gnueabi-gcc ./configure 
make

或者

export PATH=<toolchain installed dir>/arm-unknown-linux-gnueabi/bin:$PATH
./configure 
make

我总是使用第一种形式,我不确定后一种形式是否有效。

对于您的第二个问题,根据我的经验,您无需担心 sysroot。交叉编译器会自动在 sysroot/usr/include 中找到正确的 C 头文件。

除了你想交叉编译一些库并将它们安装到 sysroot 之外,你可以通过

export PATH=<toolchain installed dir>/bin:$PATH
CC=arm-unknown-linux-gnueabi-gcc ./configure --prefix=<toolchain installed dir>/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot
make
make install
于 2014-06-16T12:30:37.830 回答
2

从 Thomas Petazzoni 的演讲Anatomy of Cross-Compilation Toolchains的 38:39 开始,演讲者深入介绍了输出目录结构。

于 2019-07-29T10:51:22.803 回答