./ configure脚本接受--build,--host和--target选项。在阅读了几篇文章和文章之后,我仍然对这些选项的确切含义以及它们包括的软件感到困惑。
以下是GNU网站上的三个词段:
该版本知道三个系统名称:要在其上构建的计算机(构建),要为其构建的计算机(主机)以及GCC将为(目标)生成代码的计算机。配置GCC时,可以使用--build =,--host =和--target =来指定它们。
应避免在不指定构建的情况下指定主机,因为configure可能(并且一旦这样做)假定您指定的主机也是构建,则可能不正确。
当使用术语“在...之上建造”或“为...建造”时,他们指的是什么?从我读过的帖子中,似乎“构建”是指用于编译调试器或编译器的系统,而主机是运行调试器或编译器的系统。
我在this article中遇到的一个例子使我对“构建”到底是“构建”的确切含义感到困惑:
由于PowerPC正在为MIPS设备进行编译,这是否意味着它既是主机又是内部版本?这是否还意味着将运行调试软件的系统也归为主机系统?
根据用户评论中的this article,提到:
那么这是否意味着可以将运行编译器,链接器和调试的系统归为“主机”?那么“构建”软件包括哪些内容?
这是GNU网站上的另一段代码:
如果构建,主机和目标都相同,则称为本机。如果构建和主机相同,但目标不同,则称为交叉。如果构建,宿主和目标都不同,则称为加拿大人(出于与加拿大政党打交道的模糊原因,以及当时从事构建工作的人员的背景)。如果主机和目标相同,但是构建不同,则说明您正在使用交叉编译器为其他系统构建本机。有人将此称为“主机x主机”,“交叉本机”或“交叉构建”本机。如果构建和目标相同,但宿主不同,则说明您使用交叉编译器来构建交叉编译器,该交叉编译器为要构建的计算机生成代码。这很少见,因此没有通用的描述方式。有一个建议称其为交叉。
我对此的理解如下:
答案 0 :(得分:1)
使用“普通”软件并没有那么复杂:您拥有一个构建系统(在其中编译该软件)和一个主机系统(在其中运行)。通常两者是相同的(您在系统上为系统生产软件);但有时它们并不适用,通常是在主机系统不适合编译软件(如嵌入式设备)时,或者在尚不可用时。这种设置(当软件在一个系统(类型)上编译但将在另一系统(类型)上运行时)称为交叉编译。
如果通过第三个系统来编译编译器,因为您构建的编译器可能是交叉编译器。您正在构建的编译器将为其生成代码的系统称为 target 系统。通常,构建和宿主系统是相同的-新的编译器将在构建它的计算机上运行,这显然很适合编译软件-但有时并非如此;在这种情况下,您要构建一个将在另一个系统(主机)上运行的编译器(build),在该系统中它将为另一个系统(目标)生成代码。
post you link to描述了一种类似的情况,但是对于调试器来说,它分为两部分。服务器(一部分)在要调试的设备上运行,另一部分(gdb客户端)在连接到嵌入式设备的x86便携式计算机上运行。
现在,调试器(类似于反编译器)与编译器类似,因为它可以填充某种体系结构的机器代码。像编译器一样,并非调试器的所有部分都需要在被调试的机器上运行;我们可以使用带有 host (正在运行的主机)和 target (其了解的体系结构)的“跨调试器”。这就是这种情况。有
对于调试器的两个部分, target 都是MIPS嵌入式设备,即使它们不产生代码而是解释代码。
对于gdb client ,构建,主机和目标系统都是不同的:它是在PowerPC上构建的,由x86托管,并且针对(或了解)嵌入式MIPS的体系结构系统。对于gdb 服务器,主机和目标系统是相同的(因为它运行在其理解结构的MIPS嵌入式设备上)。
因为主机和目标是相同的,所以我们对服务器进行了经典的交叉编译。只需定义“主机”就足够了,因为如果未明确指定,则“目标”默认为“主机”。