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

最近我一直在使用GCC进行交叉编译,发现似乎是一个复杂的工具链.

我不太明白这一点,因为我的印象是GCC可以为大多数常见架构创建二进制机器代码,所有其他重要的是你链接的库和创建什么类型的可执行文件.

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

最佳答案

With a single build of GCC, all the
appropriate libraries and the correct
flags sent to GCC, could I produce a
PE executable for a Windows x86
machine, then create an ELF executable
for an embedded Linux MIPS device and
finally an executable for an OSX
PowerPC machine? If not can someone
explain how you would achieve this?

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

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

I don’t quite understand this as I was
under the impression GCC can create
binary machine code for most of the
common architectures

在GCC本身的源代码可以内置到针对各种架构的编译器中,但您仍然需要单独构建的意义上,这一点是正确的.

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

While picking a specific cpu-type will
schedule things appropriately for that
particular chip, the compiler will not
generate any code that does not run on
the i386 without the -march=cpu-type
option being used.

转载注明原文:关于GCC和交叉编译的一般问题 - 代码日志