【问题标题】:What's the difference of "./configure" option "--build", "--host" and "--target"?“./configure”选项“--build”、“--host”和“--target”有什么区别?
【发布时间】:2011-07-05 14:16:03
【问题描述】:

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

【问题讨论】:

  • Autotools 将使用错误的工具链进行交叉编译,即使使用 --host 和 --build。我有两个 C++ 项目,并且无法为 Android 构建,因为 Autotools 实在是太糟糕了。它坚持使用宿主的工具链运行测试。

标签: cross-compiling option configure autoconf


【解决方案1】:

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

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

来自GCC documentation (Host/Target specific installation notes):

如果构建、主机和目标都相同,则称为本地。如果 build 和 host 相同但 target 不同,这称为交叉。如果构建、宿主和目标都不同,则称为加拿大人(出于模糊的原因,与加拿大的政党以及当时从事构建工作的人的背景打交道)。如果主机和目标相同,但构建不同,则您正在使用交叉编译器为不同的系统构建本机。有人称其为 host-x-host、crossed native 或 cross-built native。如果 build 和 target 相同,但 host 不同,则您正在使用交叉编译器构建交叉编译器,该交叉编译器为您正在构建的机器生成代码。这种情况很少见,因此没有通用的描述方式。有人提议将此称为交叉。

【讨论】:

  • 这显然意味着--target 与任何本身不是编译器的项目无关。那么为什么它是标准配置选项呢?令人困惑。
  • @dhardy: configure 不完全是好的和干净的设计的顶峰;我猜这只是特定于应用程序的功能蠕变的结果。
  • 如果我想得到一个gcc,例如运行“./configure --build=powerpc --host=i686 --target=mips”,输出的可执行文件是否残缺?通常,gcc 是一个强大的工具,可以构建 c 代码,然后为许多平台输出多种结果。这里如果我使用'--target=mips',指定的gcc会失去能力吗?
  • 更新 config.guess 和 config.sub 文件也可能奏效,这样编译器就知道更多的目标平台。你可以在这里获取它们:gnu.org/software/gettext/manual/html_node/config_002eguess.html
【解决方案2】:

如this blog post 中所述并在GCC Configure Terms 中提到,--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 链接或有关 Canadian cross 编译的本节。

还请注意,在实践中,您可能看不到指定的构建、主机或目标,因为根据this Autoconf manual page,“目标默认为主机,主机为构建,并且构建为 config.guess 的结果。”

总之,在--build 上构建代码,在--host 和--target 架构环境下运行它。

【讨论】:

  • 如何找出“主机”和“目标”的内容?
  • 我猜你正在谈论构建一个新的编译器,因为“--target”仅与编译器相关。 * “主机”是你的新编译器应该运行的地方。 * “目标”是新编译器生成的可执行文件应该运行的地方。
  • 这难道不是一个错误的答案,因为 --host=i686 在这里无效吗?
  • 提供的答案提到编译是为 MIPS 目标完成的,这是构建,主机是 MIPS 机器的调试器。这是否意味着调试器/编译器也是由 powerpc 构建的?这是我从另一个用户 (Ned) 那里得到的评论:build = 我在哪里编译编译器,host = 编译器将在哪里运行,target = 编译器将生成什么代码。参考:stackoverflow.com/questions/7088576/…
  • 根据 Ned 的说法,这是否意味着 powerpc 既是构建/主机、x86 机器也是调试器的目标,又是 MIPS 系统的目标。你能解释一下什么是“建设”和“建设”吗?我指的是gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html。
猜你喜欢
  • 2019-04-01
  • 2011-10-28
  • 2018-12-21
  • 2016-06-12
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 2021-08-26
  • 2021-11-01
相关资源
最近更新 更多