GNU ARM嵌入式工具链与普通的gcc/g++在裸机ARM架构上的区别

3

我一直使用GNU ARM嵌入式工具链 并使用arm-none-eabi-g++ 编译我的嵌入式C++ 代码,这是我们在嵌入式系统课程中采用的方式。而在我的计算机科学课程中,我们只使用g++编译C++代码。我查看了GCC手册并发现,GCC有针对ARM体系结构的编译选项。我的问题是,在进行交叉编译时,使用ARM提供的arm-none-eabi-g++二进制文件,和使用带有-mcpu=cortex-m4 -march=armv7编译选项的g++有什么区别?似乎可以使用Ubuntu自带的gcc进行ARM的交叉编译。


gcc的设计是一个通用编译器,具有许多目标(后端)以及一些前端。但是,当您将其从源代码转换为可用的二进制文件时,您需要选择其中一个(后端)。后端作者决定了它的范围大小,例如arm-none-eabi将从arm1或arm2构建到armv7(取决于gcc的版本),包括全尺寸的arm变体和thumb变体。您计算机上的gcc会为x86构建,并支持该后端支持的任何变体,但不会为arm构建。 - old_timer
如果你安装了通用的预编译 clang/llvm,它至少可以通过使用命令行来指定后端针对所有目标生成汇编或目标级别的代码,但链接是另一回事(可以使用 GNU binutils 根据需要进行汇编和链接)。不同的人有不同的工具设计。 - old_timer
1个回答

1
我想我想出来了。所以使用GCC,您可以构建交叉编译器和相关工具链。ARM建立了自己的交叉编译器,并将其提供给人们使用作为“官方GNU ARM嵌入式工具链”。这基本上是一个元“我用编译器构建编译器问题”。我看到的选项-mcpu=cortex-m4 -march=armv7是用于在构建GCC时针对体系结构进行定位,而不是在编译时进行。

./configure --target=arm-none-eabi --prefix=/opt/gnuarm --without-headers --with-newlib --with-gnu-as --with-gnu-ld --enable-languages='c' --enable-frame-pointer=no - old_timer
现在你对C++很感兴趣,相比于C,它是一个完全不同的麻烦事,你可能想坚持使用其中一个预构建的版本。ARM网站并不是唯一可以获取预构建版本的地方,但似乎人们正在朝着这个自我宣布的官方版本聚集。 - old_timer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接