为什么 Linux From Scratch 中使用 Canadian Cross 进行交叉编译?

Lor*_*eno 8 cross-compilation

我正在阅读《Linux From Scratch 11.0》一书。在三。构建 LFS 交叉工具链和临时工具,ii。工具链技术说明,有一些关于加拿大交叉编译的内容。我不明白为什么需要 3 个阶段和 3 台机器才能达到最终结果。文本假设我们从计算机 A 和一个在 A 上运行并为 A 生成二进制文件的编译器开始。那么为什么我们不直接使用该编译器来构建一个在 C 上运行并为 C 构建二进制文件的编译器呢?构建一个在 A 上运行但为 B 构建的编译器,然后构建一个在 B 上运行但为 C 构建的编译器,最后构建在 C 上运行并为 C 构建的编译器,为什么会有这么多麻烦呢?

我还在维基百科上找到了一篇关于它的文章 - https://en.wikipedia.org/wiki/Cross_compiler

roa*_*ima 23

描述的场景是这样的

  • 机器A速度慢并且有编译器
  • 机器 B 速度快,但没有编译器
  • 机器 C 是目标,但速度很慢,并且没有编译器

您可以在 A 上构建 C 的所有二进制文件,但这会花费很长时间,因为机器 A 速度很慢。

作者认为,花少量时间在 A 上交叉编译 B 的编译器是值得的。然后,可以使用快速机器 B 来交叉编译慢速机器 C 的所有必需的二进制文件,从而减少总体时间避免在 A 或 C 上编译。

最后一步,在 C 上为 C 构建编译器,只是消除对机器 B 的依赖。虽然速度很慢,但机器 C 现在可以直接编译偶尔的程序本身。

  • @Loreno:如果您从在 A 上运行的编译器开始,并为 A 构建程序,那么它**不能**构建将在 B 上*运行*的编译器,因为它只为**构建程序A**。因此,首先,您需要构建一个*在 A* 上运行但*为 B* 构建的编译器。(这是一个在 A 上运行的程序,因此您的第一个编译器可以构建它。)。一旦你有了一个在 A 上运行但为 B 构建的编译器,你就可以开始构建在 B 上运行的编译器等。如果你的目标是为 C 编译东西,那么你的下一步很可能是构建一个在 B 上运行的编译器编译程序以在 C 上运行。 (2认同)
  • @roaima 是的 - 需要明确的是,我并不反对你的观点,只是放大了 OP 似乎遇到问题的部分:) (2认同)

Yak*_*ont 5

首先,计算机 C 并不是可以实际编译的东西。它可能是嵌入式设备,甚至只是您不想设置进行编译的生产机器。

所以你就有了这样一台“nix”机器。您需要能够对其进行交叉编译。

你所拥有的是一台构建机器。这是B。它是一个足够快、足够强大的机器,但它没有编译器。它甚至没有一个为 B 构建的编译器,更不用说为 C 构建的编译器了。你想用它来为 C 构建东西。

你怎么得到它?好吧,您与拥有 B 编译器的人交谈,最好是直接交叉编译到 C 的编译器。然后将其下载到 B,并使用它为您的定制系统 C 进行交叉编译。

他们从哪里获得 B 的编译器?他们的系统很可能与 B 不同。他们如何开始?

他们真正需要的是一个系统 A,以及一个为 A 编译程序的编译器。

现在,已经安装在 A 上的这个编译器可能无法构建交叉编译器。它只是供应商或其他东西提供的某种语言(如

您需要的是一个可以为 B 编译二进制文件的交叉编译器。为此,首先您使用 A 到 A 编译器(您的“供应商”编译器),并编译一个支持交叉编译到 B 的编译器。

接下来,您使用编译器,并让它编译一个从 B 编译到 C 的交叉编译器。

然后,您将该 B 到 C 编译器分发给拥有计算机 B 和 C 的人员。

...

现在,这是(并且曾经是)一个现实世界的问题。您有一台带有供应商编译器的 microsoft windows 计算机,或者一台 Solaris unix 计算机,或者一台 macOS 计算机。在所有情况下,您都可以轻松获得编译器,但不能轻松获得交叉编译器。这些供应商对为您提供交叉编译器兴趣不大。

您没有向您提供工具的每个人都拥有的计算机(B 和 C)。因此,您可以从“锁定”的系统 A 引导到能够构建和分发全套预构建工具以供用户下载的程度。

“硬”要求是计算机A有一个编译器,可以编译B到C的交叉编译器;其中编译器的执行指令集和编译器的目标指令集对于A来说都是外来的。