【发布时间】:2019-04-01 13:22:10
【问题描述】:
脚本./configure 接受选项--build、--host 和--target。在阅读了一些帖子和文章后,我仍然对这些选项到底是什么以及它们包含哪些软件感到困惑。
这是来自 GNU 网站的三个术语的 sn-p:
构建知道三个系统名称:您正在构建的机器(构建),您正在为其构建的机器(主机),以及 GCC 将为其生成代码的机器(目标)。当您配置 GCC 时,您可以使用 --build=、--host= 和 --target= 来指定它们。
应避免指定主机而不指定构建,因为 configure 可能(并且曾经做过)假设您指定的主机也是构建,这可能不是真的。
当使用“建立在”或“为”这个词时,他们究竟指的是什么?从我读过的帖子来看,“build on”似乎是指用于编译调试器或编译器的系统,而主机是运行调试器或编译器的系统。
我在this article 中遇到的一个例子让我对“构建”到底是什么“构建”感到困惑:
- build:您将在其上进行所有编译的 powerpc 构建机器
- 主机:您将用于在现场调试这些设备的 x86 笔记本电脑
- 目标:多个嵌入式设备,带有 MIPS 处理器,您的代码将在这些设备上运行
由于 PowerPC 正在为 MIPS 设备进行编译,这是否意味着它既是主机又是构建器?这是否也意味着运行调试软件的系统也被归类为主机系统?
根据this article在用户评论中提到:
- build = 我在哪里编译编译器
- host = 编译器将运行的位置
- target = 编译器将生成什么代码
那么这是否意味着运行编译器、链接器和调试的系统可以归类为“主机”?那么“构建”软件包括什么?
这是来自 GNU 网站的另一个 sn-p:
如果构建、主机和目标都相同,则称为本地。如果 build 和 host 相同但 target 不同,这称为交叉。如果构建、宿主和目标都不同,则称为加拿大人(出于模糊的原因,与加拿大的政党以及当时从事构建工作的人的背景有关)。如果主机和目标相同,但构建不同,则您正在使用交叉编译器为不同的系统构建本机。有人称其为 host-x-host、crossed native 或 cross-built native。如果 build 和 target 相同,但 host 不同,则您正在使用交叉编译器来构建一个交叉编译器,该交叉编译器为您正在构建的机器生成代码。这种情况很少见,因此没有通用的描述方式。有人提议将此称为 crossback。
我对此的理解如下:
- 本机 - 我运行并测试我的程序的 x86_64 机器是本机。编译器/链接器 (gcc) 是在我安装操作系统时编译和安装的,我使用 gcc 来编译我在同一台机器上本地运行的代码。
- Cross - 如果我使用相同的 x86_64 机器为 MIPS 设备编译代码,它现在是一个 cross。 x86_64 机器是主机/构建,MIPS 设备是目标。
- 加拿大 - 新版本的 GCC 发布,我决定使用另一台机器 (PowerPC2) 编译和测试新编译器。任何未来的编译器编译都将在这里完成,一旦成功测试,gcc 将部署到我的 x86_64 上。所以现在 PowerPC2 是构建,X86_64 系统是主机,MIPS 设备是目标。
- 交叉编译器 - 我们将构建系统保留为 PowerPC2,但现在我在同一 x86_64 主机上编译和运行代码。
- 最后一个设置很奇怪,它确实声明“没有通用的方法来描述构建和目标何时相同,但主机不同”。为什么要以这种方式建立系统?
【问题讨论】: