关于GCC和交叉编译的一般问题

时间:2010-12-15 22:41:48

标签: c gcc cross-compiling

最近我一直在使用GCC进行交叉编译,并发现了一个看似复杂的区域,即工具链。

我不太明白这一点,因为我的印象是GCC可以为大多数常见架构创建二进制机器代码,而其他真正重要的是你链接的库和创建的可执行类型。 / p>

海湾合作委员会不能自己做所有这些事吗?通过单一构建的GCC,所有适当的库和发送到GCC的正确标志,我可以为Windows x86机器生成PE可执行文件,然后为嵌入式Linux MIPS设备创建ELF可执行文件,最后为OSX PowerPC创建可执行文件机? 如果没有,有人可以解释你将如何实现这一目标吗?

2 个答案:

答案 0 :(得分:12)

  

单一的GCC构建,全部   适当的库和正确的   发送到GCC的标志,我可以生产一个   适用于Windows x86的PE可执行文件   机器,然后创建一个ELF可执行文件   对于嵌入式Linux MIPS设备和   最后是OSX的可执行文件   PowerPC机器?如果没有人可以   解释你将如何实现这一目标?

没有。单个GCC构建为一个目标体系结构生成目标代码。您需要针对Intel x86的构建,针对MIPS的构建以及针对PowerPC的构建。但是,尽管您可以通过单次调用GCC将源代码构建到可执行文件中,但编译器并不是您需要的唯一工具。在引擎盖下,它还使用了汇编程序(as)和链接程序(ld),并且需要为目标体系结构和平台构建这些程序集。通常GCC使用GNU binutils包中的这些工具的版本,因此您也需要为目标平台构建它们。

您可以阅读有关构建交叉编译工具链here的更多信息。

  

我不像以前那样理解这一点   在GCC可以创造的印象下   大多数的二进制机器代码   常见架构

从某种意义上说,GCC本身的源代码可以构建到针对各种体系结构的编译器中,但是你仍然需要单独的构建。


关于-march,这不允许GCC的相同构建在平台之间切换。相反,它用于选择允许用于同一系列处理器的指令。例如,最早的x86处理器不支持现代x86处理器支持的一些指令,因为它们是稍后介绍的(例如MMX和SSE等扩展指令集)。当您传递-march时,GCC将启用该处理器及其前身支持的所有操作码。引用GCC手册:

  

选择特定的cpu类型时会   为此安排适当的事情   特别是芯片,编译器不会   生成任何不运行的代码   没有-march = cpu-type的i386   正在使用的选项。

答案 1 :(得分:2)

如果您想尝试交叉编译,并且不想自己构建工具链,我建议您查看CodeSourcery。他们有一个基于GNU的工具链,他们的免费“Lite”版本支持相当多的架构。我已经将它用于Linux / ARM和Android / ARM。