【问题标题】:Clarifying the “./configure” options “--build”, “--host” and “--target”澄清“./configure”选项“--build”、“--host”和“--target”
【发布时间】: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 主机上编译和运行代码。
  • 最后一个设置很奇怪,它确实声明“没有通用的方法来描述构建和目标何时相同,但主机不同”。为什么要以这种方式建立系统?

【问题讨论】:

    标签: linux gcc configure


    【解决方案1】:

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

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

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

    现在调试器,类似于反编译器,类似于编译器,因为它可以挖掘特定架构的机器代码。像编译器一样,调试器的所有部分都不需要在被调试的机器上运行;我们可以拥有一个带有 host(它在哪里运行)和一个 target(它可以理解的架构)的“交叉调试器”。这就是这里的场景。有

    • 一个在被调试的嵌入式设备上运行的gdbserver
    • 和一个在“真机”上运行的 gdb 客户端,连接到嵌入式设备上的服务器。

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

    对于 gdb 客户端,构建、主机和目标系统都是不同的:它是在 PowerPC 上构建的,由 x86 托管,并且针对 - 或了解 MIPS 嵌入式的体系结构系统。对于 gdb 服务器,主机和目标系统是相同的(因为它运行在它理解架构的 MIPS 嵌入式设备上)。

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

    【讨论】:

    • 以 PowerPC 为例,PowerPC 将是构建和主机,x86_64 是调试器的目标,MIPS 设备是实际软件运行的目标。这是正确的吗?另外,我使用的 GCC 程序是一个交叉编译器,因为我可以为其他机器指定选项。
    • 我认为您想在 PowerPC 上构建一个 gcc,它将在 x86_64 上运行并在那里为 MIPS 生成软件?那将是 build=PowerPC,host=x86_64,target=MIPS。是的,你用 cross-gcc 构建了一个 cross-gcc。 (我认为你需要所有 3 个平台的 binutils。)
    • 我指的是这篇文章中的 PowerPC 示例:stackoverflow.com/questions/5139403/….,调试器已作为主机包含在他的示例中,我已经编辑了我的帖子在“我的理解”部分,为了便于讨论,我已将其更改为 PowerPC2。另一个用户的示例仍然是 PowerPC。
    • @supmethods 查看我的编辑...我试图解释 gdb 服务器/客户端场景。
    • 谢谢,这确实可以解决问题。 GDB 客户端是加拿大的交叉编译器:构建工具的系统和运行工具的系统不同。此外,它还针对第三个系统,即 GDB 服务器。
    猜你喜欢
    • 2011-07-05
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多