交叉编译术语——构建、宿主和目标



我看到了很多冲突信息,希望得到一些澄清。构建主机目标

构建知道三个系统名称:您正在构建的机器(构建)、您正在为其构建的计算机(主机)和GCC将为其生成代码的机器(目标)。配置GCC时,可以使用--build=、--host=和--target=指定这些GCC。

实际上,我不明白在上面的定义中,主机目标之间有什么区别。

其他页面显示

"主机"是用于编译代码的机器(或体系结构或平台);"target"是用于运行代码的机器(或体系结构或平台)。

这对我来说很有意义,但在这个解释中,主机是否总是与构建相同??我很困惑。

在我的情况下,我配置为编译器(GCC)运行在x8_64上,二进制可执行文件运行在ARM上。该程序是用C编写的,因此编译器是GCC。

./configure --build=x86_64 --host=x86_64 --target=arm-linux-gnueabihf
make
make install

听起来像构建时,主机都是x86_64,目标是arm。这是正确的吗?

我正在编译我自己的嵌入式程序,该程序运行在Jenkins机器(x86_64)上。嵌入式程序在基于ARM的机器上运行。

假设我有一台PowerPC机器正在制作一个编译器,您将在x86机器上使用(运行)该编译器,该编译器将制作在ARM上运行的二进制文件。

这使得PPC成为构建,x86成为主机,目标是ARM。正如巴西尔所评论的,这是一个加拿大十字架。

构建和主机不同的情况并不常见,但确实会发生这种情况。有时构建和主机甚至是相同的体系结构,但造成这种情况的环境有所不同。在我的x86上创建自定义工具链意味着构建和主机都是x86,但主机可能具有与构建不同的库或依赖关系版本。例如,当为在构建服务器上运行的嵌入式开发构建沙盒工具链时,就会出现这种情况。

"构建知道三个系统名称:在其上构建的机器(build)、为其构建的计算机(host)以及GCC将为其生成代码的机器(target)。当您配置GCC时,您可以用--build=--host=--target=指定这些";

  • 如果buildhosttarget都相同,则称为本机
  • 如果buildhost相同,但target不同,则称为十字架
  • 如果buildhosttarget都不同,这就被称为加拿大人(出于与加拿大政党和当时建筑工作人员的背景有关的模糊原因)
  • 如果hosttarget相同,但build不同,则使用交叉编译器为不同的系统构建本机。
    • 有些人称之为主机-x-host、交叉原生或交叉构建原生
  • 如果buildtarget相同,但host不同,则使用交叉编译器构建一个交叉编译器,为您正在构建的机器生成代码。
    • 这是罕见的,所以没有常见的描述方式。有人建议称之为横杆

来源:https://gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html

有人已经举了一个"加拿大人"的例子。

交叉编译的一个例子是,当从源代码(Linux声音库)构建sox时,您需要为编解码器等提供32位二进制文件。我刚刚在64位机器上遇到这种情况,我想为自己的使用构建它,这意味着在这种情况下:

  • buildhost(我的机器)
  • target是一个32位系统

这是我的理解,我同意这可能有点令人困惑,希望这有帮助:-)

最新更新