做嵌入式开发在以前经常需要下载交叉编译器,主要是因为那个时候的产品绝大多数位 arm架构的,而市面上基本上的 PC/服务器基本上 X86。即便现在 arm架构的笔记本和服务器慢慢推向市场,原由的那套嵌入式开发仍然无法替代,也就是说还需要使用 arm的 gcc编译器。
从早先的 arm架构到现在的 ARMv9,在不同的领域分为 Cortex-A, Cortex-R, Cortex-M,有些做的好的 IDE会把相关的 arm编译器集成进去,典型的 MDK、DS-5、ARM Developer,这些软件收费还是很高的。
gcc编译器命名规则:
arch [-vendor] [-os] [-(gnu)eabi]- gcc
- 带 [] 的是可选部分。
- arch: 芯片架构, arm 或者 aarch64,mips等
- vendor :工具链提供商,大部分工具链名字里面都没有包含这部分。
- os :编译出来的可执行文件(目标文件)针对的操作系统,比如 Linux。
- eabi - 嵌入式应用二进制接口(Embedded Application Binary Interface)
几种常见的 arm的 gcc编译器
arm-none-eabi:这个是没有操作系统的,不支持那些系统调用等等系列接口
arm-none-linux-eabi:则是使用Glibc,系统对应的是 linux
arm-eabi-gcc: 用于早期的安卓程序编译
arm-none-linux-gnueabi-gcc 用于 gnu下的 linux系统应用程序
armcc: ARM 公司推出的编译工具,可以编译裸机程序(u-boot、kernel),一般和ARM开发工具一起,Keil MDK、ADS、RVDS和DS-5中的编译器都是armcc
arm各种 gcc编译器区别
不同的 arm gcc编译器还是有不少区别, 根据编译出来的可执行程序, 通过当前编译器对应的 readelf可以看出, 比如 aarch64-linux-gnueabi-readelf
gcc 编译器加入环境变量
Linux系统默认的 gcc编译会把相关的 gcc安装到 /usr/bin下面,这个是放在 PATH变量里,这样不用每次都要使用绝对路径。
在 Ubuntu系统可以通过 apt命令直接安装,这样就不需要加到环境变量,但很多时候需要特定的工具链,特别是涉及多种架构代码的编译。
多个版本的 gcc如何切换
通过 update-alternatives来指定特定版本的 gcc
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 --slave /usr/bin/g++ g++ /usr/bin/g++-8 --slave /usr/bin/gcov gcov /usr/bin/gcov-8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70 --slave /usr/bin/g++ g++ /usr/bin/g++-7 --slave /usr/bin/gcov gcov /usr/bin/gcov-7