一、gcc
gcc,GNU Compiler Collection,GNU编译器套件,它最初是专门给GNU操作系统开发的,随着时间推移,现在已经成为了嵌入式领域应用最广泛的c/c++编译器工具。不管是单片机开发还是linux开发,都离不开gcc。主要离不开如下的优点:
1、支持众多的编程语言,不仅支持c/c++,还支持java,objective-c等语言。
2、支持主流处理器,有良好的可移植性,例如arm、i386等。
3、具有丰富的配套工具链支持,从名字可以看出,gcc是一个套件,并不是一个单纯的编译器,故它可以与调试工具gdb等工具配套使用。
4、性能优秀,gcc编译后生成的代码具有很高的可靠性和运行效率。同时支持并行编译。
更关键的是gcc是一个交叉平台编译器,他能够在当前CPU平台上为不同体系结构的硬件平台开发软件,尤其适合嵌入式领域。比如单片机开发,用keil工具开发时,使用的就是gcc编译,编译成.bin文件后,烧录到单片机中即可运行。更不用说linux开发,也是同样的道理。
除了gcc之外,还有clang、Visual Studio等编译器。clang兼容gcc,目标是超越gcc,所以在linux领域和gcc竞争激烈。visual studio是微软的开发工具包,其中包含编译器,一般用于windows下。
而历史上也出现了很多的编译器,甚至还有一段不得不提的“编译器圣战”历史,但是随着时间的推移,大部分都淹没在历史的长河中。
二、Linaro
目前在嵌入式领域,绝大部分的芯片都是基于arm技术,而这些芯片又是由arm授权ip给不同的公司开发,这就导致了基于ARM的解决方案和软件体系十分庞大,所以为了解决ARM生态系统中,重复投资造成的资源浪费,2010年6月,由ARM发起,IBM、Freescale、Samsung、ST、TI这6家公司宣布合资成立Linaro的非盈利公司。
Linaro公司主要关注Linux开源软件中间层和底层软件(内核和工具链等),并不涉及高层应用软件,并且所有的软件均开源。技术方面主要收技术指导委员会(Technical Steering Committee,TSC)控制,它来控制项目的规划和实现。
三、Linaro gcc
当在linux中编辑完代码后,需要用gcc编译器编译后才能运行。但是ubuntu运行在windows下,所以它自带的gcc编译器是针对X86架构的,编译后的可执行文件也只能在X86架构上运行,但是要运行在arm架构的开发板上必须使用交叉编译工具链进行编译。
基于arm架构的gcc交叉编译工具链有很多,在Linaro成立以前,比较有名的例如CodeSourcery公司,但在Linaro成立后,推出了gcc-linaro-arm-linux-gnueabihf交叉编译工具链。已经成为目前最常用的工具链。
到如今2021/6/7号,该工具链的版本已经到了10.2.1。

四、交叉编译工具链命名
1、命名规则
arch [-vendor] [-os] [-(gnu)eabi]
解释如下:
arch:体系架构,例如ARM、MIPS。
vendor:工具链提供商。
os:目标操作系统。
eabi:嵌入式应用二进制接口。
例如gcc-linaro-arm-linux-gnueabihf,vendor=linaro,os=linux,gnueabihf为最后一部分。
2、gnueabihf
gnueabihf这到底是什么含义?这个单词应该拆分为3个部分来看,gnu、eabi和hf。
gnu显然代表了GNU组织。
abi是二进制应用程序接口,而eabi是嵌入式ABI,故这两者的区别是abi是用于计算机上的,eabi用于嵌入式平台上。
hf对应于armhf架构,如果不带hf,则对应于armel架构。这两个架构在对待浮点运算采用了不同的策略。所以有时候会看到arm-linux-gnueabi-gcc和arm-linux-gnueabihf-gcc,区别就是对应的arm架构不同。
最后值得一提的是,arm-gcc可分为支持或不支持操作系统。一般情况下如果不带linux,则表明这是针对裸机的编译器。例如armcc,它是ARM公司推出的编译工具,一般与ARM开发工具一起提供,例如Keil MDK等,开发过ST芯片的工程师一定不陌生。
五、Linaro gcc 安装
按照正点原子的推荐,这里安装4.9版本的linaro gcc,把该库的压缩包放到/usr/local/arm下,并解压缩。
打开配置文件,把arm-linux-gnueabihf-gcc的路径添加到环境变量中
sudo vi /etc/profile
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
添加完以后,必须要重启,否则配置不会生效。
除此之外,还要安装两个库,执行如下命令
sudo apt-get install lsb-core lib32stdc++6
LSB,Linux Standard Base,因为linux的发行版非常繁多,LSB促进了它们之间的兼容性,使得各种软件可以很好的在兼容LSB标准的系统上运行。
lib32stdc++6,即GNU C++标准库。
如果执行如下命令成功,则说明arm-linux-gnueabihf-gcc可以使用,可以看到版本号违4.9.4。
arm-linux-gnueabihf-gcc -v




















