交叉编译术语---构建,主机和目标

时间:2017-10-30 08:00:39

标签: gcc cross-compiling

我看到很多冲突信息,想要澄清一下。 构建主机目标

  

构建知道有三个系统名称:您正在构建的机器(构建),您正在构建的机器(主机),以及GCC将为(目标)生成代码的机器。配置GCC时,请使用--build =, - host =和--target =。

指定这些

实际上,我不明白上述定义中主机目标之间的区别。

其他一些页面说

  

'host'是您用来编译代码的机器(或架构或平台);   'target'是用于运行代码的机器(或体系结构或平台)。

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

在我的情况下,我正在配置这样的 编译器(GCC)在x86_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的机器上运行。

2 个答案:

答案 0 :(得分:1)

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

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

拥有不同的构建和主机并不常见,但它肯定会发生。有时构建和主机甚至是相同的架构,但导致这种情况的环境有所不同。在x86上创建自定义工具链意味着构建和主机是x86,但主机可能具有与构建不同的库或依赖项版本。例如,为构建服务器上运行的嵌入式开发构建沙盒工具链时就是这种情况。

答案 1 :(得分:0)

<块引用>

“构建知道三个系统名称:您正在构建的机器(build),您正在构建的机器(host),以及 GCC 将要构建的机器为 (target) 生成代码。配置 GCC 时,您可以使用 --build=--host=--target="

指定这些

...

  • 如果 buildhosttarget 都相同,则称为原生。
  • 如果 buildhost 相同但 target 不同,则称为交叉。
  • 如果 buildhosttarget 都不同,这被称为加拿大人(出于与加拿大政党打交道的不明原因以及在那个时候)。
  • 如果 hosttarget 相同,但 build 不同,则您正在使用交叉编译器为不同的系统构建本机。
    • 有些人称之为主机-x-主机、交叉原生或交叉构建的原生。
  • 如果 buildtarget 相同,但 host 不同,则您正在使用交叉编译器构建交叉编译器,该交叉编译器为您正在构建的机器生成代码.
    • 这种情况很少见,因此没有通用的描述方式。有人建议将此称为交叉。

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

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

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

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

无论如何,这是我的理解,我同意这可能解释得有点混乱,希望这会有所帮助:-)