文章目录
嵌入式开发之交叉编译工具链制作
1. 为什么需要交叉编译工具链?
pclinux发行版都自带gnu工具,包括gcc/g++等,其编译出来的应用程序只能运行在pc平台上,如果需要编译针对嵌入式平台的应用程序,则需要嵌入式平台操作系统提供的gnu工具,一般嵌入式linux系统都是裁减过的,系统不会有gcc/g++,就算有,用其编译大型软件也不现实,可以想象速度之慢,
因此,我们需要制作符合目标平台的交叉编译工具链,该工具链运行在PC平台上,用其编译出来的应用程序运行于对应目标平台上,交叉由此而来。
2. 一定要自己制作吗?
可以使用网上他人制作好的一些通用的交叉编译工具链,但由于其不是特定于某一平台,因此编译出来的程序不是最优的,性能可能会打折扣,也可能会出现一些兼容性问题,因此建议针对特定平台制作符合目标平台的交叉编译工具链。
比如常见的codesourcery公司基于GCC推出的的ARM交叉编译工具:
arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
3. 交叉编译工具链命名解释
arch [-vendor] [-os] [-(gnu)eabi]
arch - 架构,比如arm
vendor - 工具链提供商,比如none
os - 目标平台操作系统,比如linux
eabi - 嵌入式应用二进制接口
- 比如rm-none-linux-gnueabi-gcc 主要用于基于ARM架构的Linux系统,可用于编译 ARM 架构的u-boot、Linux内核、linux应用等。arm-none-linux-gnueabi基于GCC,使用Glibc库,经过 Codesourcery公司优化过推出的编译器。arm-none-linux-gnueabi-xxx交叉编译工具的浮点运算非常优秀,一般ARM9、ARM11、Cortex-A 内核,带有 Linux操作系统的会用到,见上文。
- 另外这里说明下
arm-linux-gnueabi-gcc
和arm-linux-gnueabihf-gcc
的区别,两个交叉编译器分别适用于 armel 和 armhf 两个不同的架构,只是armel 和 armhf 这两种架构在对待浮点运算采取不同的策略。带hf
(hard模式)说明使用fpu计算,同时传参也用fpu中的浮点寄存器,性能最好,不带hf
说明要么用fpu计算,但传参用普通寄存器(softfp模式),或者不用fpu,软件模式(soft模式)。
4. 交叉编译工具链制作实战
编译环境:
centos7, gcc/g++4.8.5
目标平台:
Hardware : Freescale i.MX6 Ultralite (Device Tree)
model name : ARMv7 Processor rev 5 (v7l)
4.1 下载crosstool-ng源码,进行安装
解压、configure、make、make install
成果物:ct-ng
4.2 ct-ng list-samples
选择最接近的配置模板,比如我的是A7平台,选择了最接近的arm-cortex_a8-linux-gnueabi,如下图:
4.3 ct-ng arm-cortex_a8-linux-gnueabi
会在当前工作目录生成默认.config配置文件
4.4 ct-ng menuconfig
使用menuconfig进行图形化配置选择,就像裁减内核一样
4.4.1 Paths and misc options
4.4.2 Target options
4.4.3 Toolchain options
4.4.4 Operating system
目标系统Linux的内核为4.1.15,此处选择的内核不大于4.1.15
4.4.5 C compiler
考虑到稳定性,选择稍微低一点版本的gcc
4.5 ct-ng build
执行命令ct-ng build
, 会开始下载一些源码包到目录/home/sam/src
,比如linux内核,gnu工具等,如果在公司内网可能无法下成功(速度过慢或者网站被过滤了),这个时候就需要发挥自己网络上寻找资源的能力了,手动下载tarball(源码包)到/home/sam/src
目录,最终会用到的源码资源如下:
libelf-0.8.13.tar.gz
https://fossies.org/linux/misc/old/libelf-0.8.13.tar.gz
另外可以查看.config配置文件
中给出的资源下载路径,上面的libelf就是这样找到的。
接下来就是漫长时间的等待,我自己build时长如下(2个多小时):
5.成果物
c++5.5.0源码,编译工具等