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

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

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

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

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

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

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

我不太明白这一点,因为我认为GCC可以为大多数常见架构创建二进制机器代码

这是正确的,因为GCC的源代码本身可以构建到针对各种体系结构的编译器中,但是您仍然需要单独的构建。


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

虽然选择特定的cpu类型将为该特定芯片安排适当的事情,但如果没有使用-march = cpu-type选项,编译器将不会生成任何不在i386上运行的代码。

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