阐明“./configure”选项“--build”、“--host”和“--target”

Clarifying the “./configure” options “--build”, “--host” and “--target”

脚本 ./configure 接受选项 --build、--host 和 --target。在阅读了一些 post 和文章之后,我仍然对这些选项到底是什么以及它们包含什么软件感到困惑。

这是来自 GNU 网站的三个术语的片段:

There are three system names that the build knows about: the machine you are building on (build), the machine that you are building for (host), and the machine that GCC will produce code for (target). When you configure GCC, you specify these with --build=, --host=, and --target=.

Specifying the host without specifying the build should be avoided, as configure may (and once did) assume that the host you specify is also the build, which may not be true.

他们在使用术语“建立在”或“建立于”时指的到底是什么?从我读过的 post 看来,“building on”似乎是指用于编译调试器或编译器的系统,而主机是 运行 调试器或编译器所在的系统。

我在 this article 中遇到的一个例子让我对“构建”究竟是什么“构建”感到困惑:

由于 PowerPC 正在为 MIPS 设备进行编译,这是否意味着它既是主机也是构建?这是否也意味着 运行 调试软件的系统也被归类为主机系统?

根据this article用户评论中提到:

这是否意味着系统 运行ning 编译器、链接器和调试器可以归类为“主机”?那么“构建于”软件包括什么?

这是来自 GNU 网站的另一个片段:

If build, host, and target are all the same, this is called a native. If build and host are the same but target is different, this is called a cross. If build, host, and target are all different this is called a canadian (for obscure reasons dealing with Canada’s political party and the background of the person working on the build at that time). If host and target are the same, but build is different, you are using a cross-compiler to build a native for a different system. Some people call this a host-x-host, crossed native, or cross-built native. If build and target are the same, but host is different, you are using a cross compiler to build a cross compiler that produces code for the machine you’re building on. This is rare, so there is no common way of describing it. There is a proposal to call this a crossback.

我对此的理解如下:

使用 "normal" 软件并没有那么复杂:您有一个构建系统(编译软件的地方)和一个主机系统(它将 运行 编译的地方)。通常这两者是相同的(你在你的系统上为你的系统生产软件);但有时它们不是,通常是如果主机系统不太适合编译软件,例如嵌入式设备,或者当它(还)不可用时。这种设置 — 当软件在一个系统(类型)上编译但 运行 在不同的系统(类型)上 — 称为交叉编译。

如果您通过第三方系统编译编译器,因为您构建的编译器可能是交叉编译器。您正在构建的编译器将为其生成代码的系统称为 target 系统。通常构建和主机系统是相同的——你的新编译器将在你构建它的机器上 运行,这显然非常适合编译软件——但有时它不是;在这种情况下,您正在构建一个编译器 (build),它将 运行 在不同的系统(主机)上为另一个系统(目标)生成代码。

post you link to 描述了类似的场景,但调试器分为两部分。一部分是服务器,运行s 在被调试的设备上,另一部分是 gdb 客户端,运行s 在连接到嵌入式设备的 x86 笔记本电脑上。

现在,调试器类似于反编译器,类似于编译器,因为它可以理解特定体系结构的机器代码。与编译器一样,并非调试器的所有部分都需要在被调试的机器上 运行;我们可以有一个 "cross-debugger" 和一个 host (它是 运行ning)和一个 target (它理解的架构).这就是这里的情况。有

  • a gdbserver 运行正在调试的嵌入式设备上
  • 和一个 gdb 客户端 运行 宁 "real machine" 连接到嵌入式设备上的服务器。

对于调试器的两个部分,目标 是 MIPS 嵌入式设备,即使它们不生成代码但解释它。

对于 gdb client 构建、主机和目标系统都是不同的:它构建在 PowerPC 上,由 x86 托管,目标是——或理解体系结构——MIPS 嵌入式系统。对于 gdb server,主机和目标系统是相同的(因为它 运行 在 MIPS 嵌入式设备上,其架构是可以理解的)。

因为主机和目标是相同的,所以我们有一个经典的服务器交叉编译;只需定义 "host" 就足够了,因为如果未明确指定,"target" 默认为 "host"。