阐明“./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 构建机器
- 主机:一台 x86 笔记本电脑,您将使用它在现场调试这些设备
- 目标:几个嵌入式设备,带有 MIPS 处理器,您的代码将在运行上
由于 PowerPC 正在为 MIPS 设备进行编译,这是否意味着它既是主机也是构建?这是否也意味着 运行 调试软件的系统也被归类为主机系统?
根据this article用户评论中提到:
- build = 我在哪里编译编译器
- host = 编译器将 运行
- target = 编译器将生成什么代码
这是否意味着系统 运行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.
我对此的理解如下:
- Native - 我的 x86_64 机器我 运行 并测试我的程序是本地的。 compiler/linker (gcc) 是在我安装 OS 时编译和安装的,我使用 gcc 编译我在同一台机器上本地 运行 的代码。
- Cross - 如果我使用相同的 x86_64 机器为 MIPS 设备编译代码,它现在是一个 cross。 x86_64 机器是 host/build,MIPS 设备是目标。
- Canadian - 发布了更新版本的 GCC,我决定使用另一台机器 (PowerPC2) 来编译和测试新的编译器。任何未来的编译器编译都将在这里完成,一旦测试成功,gcc 将部署到我的 x86_64 上。所以 PowerPC2 现在是构建,X86_64 系统是主机,MIPS 设备是目标。
- 交叉编译器 - 我们将构建系统保留为 PowerPC2,但现在我在同一台 x86_64 主机上编译和 运行ning 代码。
- 最后一个设置相当奇怪,它确实声明“没有通用的方法来描述何时构建和目标相同,但主机不同”。为什么要这样搭建系统?
使用 "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"。
脚本 ./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 构建机器
- 主机:一台 x86 笔记本电脑,您将使用它在现场调试这些设备
- 目标:几个嵌入式设备,带有 MIPS 处理器,您的代码将在运行上
由于 PowerPC 正在为 MIPS 设备进行编译,这是否意味着它既是主机也是构建?这是否也意味着 运行 调试软件的系统也被归类为主机系统?
根据this article用户评论中提到:
- build = 我在哪里编译编译器
- host = 编译器将 运行
- target = 编译器将生成什么代码
这是否意味着系统 运行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.
我对此的理解如下:
- Native - 我的 x86_64 机器我 运行 并测试我的程序是本地的。 compiler/linker (gcc) 是在我安装 OS 时编译和安装的,我使用 gcc 编译我在同一台机器上本地 运行 的代码。
- Cross - 如果我使用相同的 x86_64 机器为 MIPS 设备编译代码,它现在是一个 cross。 x86_64 机器是 host/build,MIPS 设备是目标。
- Canadian - 发布了更新版本的 GCC,我决定使用另一台机器 (PowerPC2) 来编译和测试新的编译器。任何未来的编译器编译都将在这里完成,一旦测试成功,gcc 将部署到我的 x86_64 上。所以 PowerPC2 现在是构建,X86_64 系统是主机,MIPS 设备是目标。
- 交叉编译器 - 我们将构建系统保留为 PowerPC2,但现在我在同一台 x86_64 主机上编译和 运行ning 代码。
- 最后一个设置相当奇怪,它确实声明“没有通用的方法来描述何时构建和目标相同,但主机不同”。为什么要这样搭建系统?
使用 "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"。