“ ./configure”选项“—— build”、“—— host”和“—— target”有什么区别?

脚本 ./configure接受3个选项 --build--host--target。我搞混了他们的角色。它们的区别和语义是什么?

85853 次浏览

注意: 参数 --target只有在构建编译器时才有意义:

  • 你正在建造的机器
  • 你正在建造的机器
  • --target: GCC 将为其生成二进制文件的机器

来自 海湾合作委员会文件(特定于主机/目标的安装说明) :

如果构建、主机和目标都相同,则称为本机。如果构建和主机是相同的,但目标不同,这称为交叉。如果构建、主机和目标都不相同,那么它就被称为加拿大人(由于处理加拿大政党和当时从事构建工作的人的背景的隐晦原因)。如果主机和目标是相同的,但是构建是不同的,那么您正在使用交叉编译器为不同的系统构建本机。有些人称之为 host-x-host、交叉本机或交叉构建本机。如果 build 和 target 是相同的,但 host 是不同的,那么您正在使用交叉编译器来构建一个交叉编译器,该编译器为您正在构建的机器生成代码。这种情况很少见,因此没有通常的描述方式。有人建议把这个叫做横梁。

正如在 这篇博文海湾合作委员会配置术语中提到的,--target仅适用于编译工具链时。正常交叉编译所使用的库或二进制文件时

--build=the architecture of the build machine
--host=the architecture that you want the file to run on

但是,当您构建 工具链时,事情可能会变得更加复杂。我认为下面的内容是正确的(尽管我不能说我曾经手动编译过交叉调试器) :

假设你有:

  • 您将在其上进行所有编译的 PowerPC 构建机器
  • 几个嵌入式设备,使用 mips 处理器,代码将在其上运行
  • 一台 x86的笔记本电脑,您将使用它在现场调试这些设备

配置并构建调试服务器(例如 gdbserver) ,以便在嵌入式设备上运行

./configure --build=powerpc --host=mips

这样您就可以安装到嵌入式设备上并运行“ gdbserver: 1234 a.out”来开始调试并监听端口1234。

然后构建调试客户机(连接并控制 gdbserver)

./configure --build=powerpc --host=i686 --target=mips

您可以将其复制到 x86笔记本电脑,以便在字段中运行“ gdbclient 嵌入式设备: 1234”,从而调试您的 a.out 程序。

这也适用于您可能希望查看上面的 GCC 链接或关于 加拿大十字架编译的本节的编译器。

还要注意,在实践中,您可能看不到指定的 build、 host 或 target,因为根据 本 Autoconf 手册页,“ target 默认为 host,host 默认为 build,而 build 则是 config.guess 的结果。”

总之,在 --build上构建代码,在 --host上使用 --target体系结构环境运行代码。