澄清“ ./configure”选项“ --build”,“-host”和“ --target”

时间:2018-10-28 12:22:42

标签: linux gcc configure

./ configure脚本接受--build,--host和--target选项。在阅读了几篇文章和文章之后,我仍然对这些选项的确切含义以及它们包括的软件感到困惑。

以下是GNU网站上的三个词段:

  

该版本知道三个系统名称:要在其上构建的计算机(构建),要为其构建的计算机(主机)以及GCC将为(目标)生成代码的计算机。配置GCC时,可以使用--build =,--host =和--target =来指定它们。

     

应避免在不指定构建的情况下指定主机,因为configure可能(并且一旦这样做)假定您指定的主机也是构建,则可能不正确。

当使用术语“在...之上建造”或“为...建造”时,他们指的是什么?从我读过的帖子中,似乎“构建”是指用于编译调试器或编译器的系统,而主机是运行调试器或编译器的系统。

我在this article中遇到的一个例子使我对“构建”到底是“构建”的确切含义感到困惑:

  • build:您将在其上进行所有编译的powerpc构建机器
  • 主机:您将用于在现场调试这些设备的x86笔记本电脑
  • 目标:您的代码将在其上运行的具有MIPS处理器的多个嵌入式设备

由于PowerPC正在为MIPS设备进行编译,这是否意味着它既是主机又是内部版本?这是否还意味着将运行调试软件的系统也归为主机系统?

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

  • build =我在哪里编译编译器
  • host =编译器将在其中运行
  • target =编译器将生成什么代码

那么这是否意味着可以将运行编译器,链接器和调试的系统归为“主机”?那么“构建”软件包括哪些内容?

这是GNU网站上的另一段代码:

  

如果构建,主机和目标都相同,则称为本机。如果构建和主机相同,但目标不同,则称为交叉。如果构建,宿主和目标都不同,则称为加拿大人(出于与加拿大政党打交道的模糊原因,以及当时从事构建工作的人员的背景)。如果主机和目标相同,但是构建不同,则说明您正在使用交叉编译器为其他系统构建本机。有人将此称为“主机x主机”,“交叉本机”或“交叉构建”本机。如果构建和目标相同,但宿主不同,则说明您使用交叉编译器来构建交叉编译器,该交叉编译器为要构建的计算机生成代码。这很少见,因此没有通用的描述方式。有一个建议称其为交叉。

我对此的理解如下:

  • 本机-运行和测试我的程序的x86_64计算机是本机的。当我安装操作系统时,已编译并安装了编译器/链接器(gcc),我使用gcc来编译在同一台计算机上本地运行的代码。
  • 交叉-如果我使用同一台x86_64机器为MIPS设备编译代码,则现在是交叉。 x86_64计算机是主机/内部版本,而MIPS设备是目标。
  • Canadian-已发布较新版本的GCC,我决定使用另一台计算机(PowerPC2)编译和测试新的编译器。以后任何编译器的编译都将在这里完成,一旦成功测试,gcc就会部署到我的x86_64上。因此,现在是PowerPC2的内部版本,X86_64系统是主机,而MIPS设备是目标。
  • 交叉编译器-我们将构建系统保留为PowerPC2,但现在我在同一x86_64主机上编译和运行代码。
  • 最后一个设置很奇怪,它确实声明“没有通用的方式来描述何时构建和目标相同,但宿主不同。”您为什么要以这种方式设置系统?

1 个答案:

答案 0 :(得分:1)

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

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

post you link to描述了一种类似的情况,但是对于调试器来说,它分为两部分。服务器(一部分)在要调试的设备上运行,另一部分(gdb客户端)在连接到嵌入式设备的x86便携式计算机上运行。

现在,调试器(类似于反编译器)与编译器类似,因为它可以填充某种体系结构的机器代码。像编译器一样,并非调试器的所有部分都需要在被调试的机器上运行;我们可以使用带有 host (正在运行的主机)和 target (其了解的体系结构)的“跨调试器”。这就是这种情况。有

  • 正在调试的嵌入式设备上运行的 gdbserver
  • 和在连接到嵌入式设备上服务器的“真实计算机”上运行的 gdb客户端

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

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

因为主机和目标是相同的,所以我们对服务器进行了经典的交叉编译。只需定义“主机”就足够了,因为如果未明确指定,则“目标”默认为“主机”。