"./configure"选项中的"--build"、"--host"和"--target"有什么区别?

135

脚本./configure接受三个选项--build--host--target。我对它们的角色感到困惑。它们之间有什么不同和语义差异?


Autotools会在交叉编译时使用错误的工具链,即使使用了--host--build参数。我有两个C++项目,由于Autotools的问题,无法为Android构建这些项目。它坚持使用主机的工具链来运行测试。 - jww
2个回答

123

如同在这篇博客文章中所指出的并在GCC配置术语中提到的那样,--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 embedded.device:1234"来调试你的a.out程序。

这对于编译器也适用,你可能需要查看上面提到的GCC链接或者关于加拿大交叉编译的这个部分。

此外,要注意的是,在实际应用中,你可能不会看到build、host或target被指定,因为根据这个Autoconf手册页面,“目标默认为主机,主机为构建,而构建则为config.guess的结果。”

总之,在--build上构建代码,在一个--host环境中运行它,具有--target体系结构。


14
如何确定“host”和“target”的填写内容? - Black
4
我想你在谈论建立一个新的编译器,因为"--target"只与编译器有关。
  • "host"是指你的新编译器应该运行的位置。
  • "target"是指由你的新编译器生成的可执行文件应该运行的位置。
- user1735594
这不会变成错误的答案吗?因为--host=i686在这里无效? - infoclogged
1
提供的答案提到编译是针对MIPS目标完成的,这是构建过程,而主机是MIPS机器的调试器。这是否意味着调试器/编译器也是由powerpc构建的?这是我从另一个用户(Ned)那里得到的评论:build = 我在哪里编译编译器,host = 编译器将在哪里运行,target = 编译器将生成什么代码。参考:https://dev59.com/Z2w05IYBdhLWcg3wszwl?rq=1 - supmethods
根据Ned的说法,这是否意味着powerpc既是构建/主机,x86机器是调试器的目标,也是MIPS系统的目标。您能否更详细地解释一下“构建”和“构建于”的含义?我参考了https://gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html。 - supmethods
在我看来,经常混淆是因为这些术语是相对的:当您使用其他人构建的交叉编译器时,它们会发生变化。https://mesonbuild.com/Cross-compilation.html - MarcH

78

注意: 仅在构建编译器(例如GCC)时,参数--target 才有意义。 在构建GCC之前运行configure时:

  • --build: 安装GCC的主机
  • --host: GCC将要运行在哪台主机上
  • --target: 构建出的二进制文件将在哪台主机上运行

来自GCC文档 (特定主机/目标安装说明):

如果构建、主机和目标都相同,则称为本机(native)。如果构建和主机相同,但目标不同,则称为交叉(cross)。如果构建、主机和目标都不同,则称为加拿大式(canadian)(由于加拿大政党和当时从事构建工作的人的背景原因而产生的玩笑)。如果主机和目标相同,但构建不同,则使用交叉编译器为不同系统构建本机。有些人称之为主机-x-主机(host-x-host)、交叉本机(crossed native)或交叉构建本机(cross-built native)。如果构建和目标相同,但主机不同,则使用交叉编译器构建可在正在构建的计算机上运行的交叉编译器。这种情况很少见,因此没有通用的描述方式。有一个提议称其为crossback。


3
显然,--target选项只适用于编译器本身而非其他项目。那么为什么它还是一个标准配置选项呢?令人困惑。 - dhardy
1
@dhardy: configure并不是一个良好且清晰设计的顶峰;我猜这只是应用特定功能蔓延的结果。 - Tim Čas
如果我想获取gcc,例如运行"./configure --build=powerpc --host=i686 --target=mips",输出的可执行文件是否受限呢?通常,gcc是一个强大的工具,可以构建C代码,然后为许多平台输出许多种结果。在这里,如果我使用'--target=mips',指定的gcc是否失去了能力? - gfan
另外一个可能有效的方法是更新config.guess和config.sub文件,这样编译器就可以了解更多的目标平台..你可以在这里获取它们:https://www.gnu.org/software/gettext/manual/html_node/config_002eguess.html - wirtsi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接