【问题标题】:cross-compilation terminologies --- build, host and target交叉编译术语——构建、宿主和目标
【发布时间】:2018-04-11 03:32:40
【问题描述】:

我看到很多冲突信息,希望得到澄清。 buildhosttarget

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

其实我不明白上面定义中的hosttarget有什么区别。

其他页面说

‘host’是你用来编译代码的机器(或架构,或平台); “目标”是用于运行代码的机器(或架构或平台)。

这对我来说是有道理的,但在这个解释中,host 是否总是与 build 相同?我很困惑。

就我而言,我的配置是这样的 编译器 (GCC) 在 x86_64 机器上运行,二进制可执行文件在 ARM 上运行。程序是用C编写的,所以编译器是GCC。

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

听起来像 build,host 都是 x86_64,target 是 arm。对吗?

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

【问题讨论】:

  • 你在编译什么程序? GCC 的一些交叉编译器版本,或者只是您自己的程序和已经可用的 gcc 二进制文件?显示一些 minimal reproducible example (所以在你的问题中显示一些源代码)并显示你正在使用的 exact 编译命令(并解释它们在哪些计算机上运行)。讲述你的系统(什么是主机、构建机器、目标机器)。请编辑您的问题以改进它。目前令人困惑。
  • 即使进行了编辑,您的问题也不清楚:“我正在配置这样的编译器”是什么意思? 配置了什么,如何配置?请进一步改进您的问题给出确切的命令。解释他们在哪些计算机上运行。 你使用什么编译器? 你如何使用它?
  • 显然英语不是你的母语(我也不是;我是法国人)。所以改进你的措辞(也许在一些字典的帮助下),并给出你正在使用的确切的命令。恕我直言,“我正在配置使得编译器在 x86_64 机器上运行而二进制可执行文件在 ARM 上运行”这句话没有任何意义(你不知道你在配置什么以及如何配置)。鉴于英语对您来说并不容易,您需要在问题中添加更多信息和冗余。
  • 花点时间改进您的问题,提供一些minimal reproducible example 并提供用于构建和测试您的程序的确切命令
  • @BasileStarynkevitch 没关系。我想你澄清了我的误解。非常感谢。

标签: gcc cross-compiling


【解决方案1】:

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

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

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

【讨论】:

  • 这种情况称为加拿大交叉编译器。我不知道为什么。
  • @BasileStarynkevitch 我更加困惑。我不是在制作编译器。我正在使用 Makefile 生成在 ARM 上运行的二进制文件。 makefile 在 x86_64 机器上运行,但二进制可执行文件需要在 ARM 机器上运行。
  • @SteveHe:您正在配置 GCC,因此您正在构建一个编译器(gcc 的一些二进制文件)。否则,你的问题没有任何意义。
  • @BasileStarynkevitch 我明白了。所以,就我而言,这听起来像是 build,host 都是 x86_64,target 是 arm。你觉得对吗?
  • @SteveHe:不要在这里发表评论,但是编辑您的问题 来改进它。我刚刚投票关闭它,因为它非常不清楚。
【解决方案2】:

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

...

  • 如果buildhosttarget都相同,则称为本地。
  • 如果buildhost 相同但target 不同,则称为交叉。
  • 如果buildhosttarget 都不同,则这被称为加拿大人(出于晦涩的原因,涉及到加拿大的政党和当时从事构建工作的人的背景)。李>
  • 如果hosttarget 相同,但build 不同,则您正在使用交叉编译器为不同的系统构建本机。
    • 有些人称之为 host-x-host、crossed native 或 cross-built native。
  • 如果 buildtarget 相同,但 host 不同,则您正在使用交叉编译器构建一个交叉编译器,该交叉编译器为您正在构建的机器生成代码。
    • 这种情况很少见,因此没有通用的描述方式。有人提议将此称为 crossback。

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

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

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

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

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

【讨论】:

  • > 您正在为(主机)构建的机器,以及 GCC 将为(目标)生成代码的机器。
  • 我不明白上面解释中hosttarget 之间的区别。我们构建的机器应该与 GCC 为其生成代码的机器相同,不是吗?
  • 没有。在我的sox 示例中,为(我的 64 位机器)构建的机器正在运行 32 位库。即使我的机器与它的架构不匹配,我的机器也可以运行这些库(我的发行版通过MultiarchSpecpreviously 通过ia32-libs 实现了这一点)。这个问题也被问到here 并回答为“构建 = 我在哪里编译编译器,主机 = 编译器将在哪里运行,目标 = 编译器将生成什么代码”
猜你喜欢
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 2013-03-17
  • 2020-02-05
相关资源
最近更新 更多