交叉编译编译器有意义吗?

时间:2014-05-02 05:14:44

标签: linux gcc cross-compiling

我只是有一个“等什么,嗯......”时刻。

假设您要为目标体系结构 a 生成编译器 A ,通常配置阶段的结果取决于您用于{{1}的值},意味着您的工具需要能够生成和处理 a 的编译对象。

现在,通常在使用gcc作为主编译器的常见GNU / Linux发行版下,你想要的第一件事是获取binutils并为你的目标构建它们,但是你没有与你的兼容的编译器给定目标,因为这是你首先要做的,为 a 创建一个工具链,所以这里开始了一个难题:如何打破这个循环?

现在假设我之前的示例考虑并在具有 b 架构的机器上运行,明显不同于 a ,因为我们总是在谈论交叉编译例如,你很幸运,硬件制造商在具有 a 架构的机器上发布 a 的gcc,你仍然必须解决如何构建 a <的问题/ strong> on b 并打破上一个循环。换句话说,即使您在原始体系结构上获得对编译器的支持,当您想要交叉编译时,这也不起任何作用。

那么这背后的逻辑是什么以及如何打破循环?

1 个答案:

答案 0 :(得分:2)

“gcc”编译器也是“self-hosting”。因此,您通常在非目标平台上构建一个“stage1”编译器,然后移动到目标系统并使用“stage1”(运行“stage3”)重新构建编译器。

首先需要了解“Target Triplets”(你列出了一个“--target”),但你也有“--host”和“--build”。从链接

  

- 构建=积聚型

     

正在配置和编译包的系统类型。它默认为运行config.guess的结果。

     

- 主机=主机型

     

程序包运行的系统类型。默认情况下,它与构建计算机相同。指定它可启用交叉编译模式。

     

- 目标=目标型

     

包中的任何编译器工具生成代码(很少需要)的系统类型。默认情况下,它与主机相同。

另请参阅Cross Linux From Scratch,以及NetBSD处的惊人的工作。