一、交叉编译工具链介绍
1.1 交叉编译
本地编译:在当前目标平台下,编译出来的程序,放到当前平台下,就可以运行的
交叉编译:在一种平台上编译,编译出来的程序,放到别的平台上运行(编译和运行环境不一样,属于交叉的)
交叉编译是一个和本地编译,相对应的概念。主要和嵌入式开发有关,由于嵌入式系统中的各种资源相对有限,只够嵌入式系统运行的,没太多剩余的资源,所以很难进行直接的本地编译
1.2 交叉编译工具链
编译过程是按照不同的子功能,依照先后顺序组成的一个复杂的流程,如下图:
编译过程包括了预处理、编译、汇编、链接等功能。每个子功能都是一个单独的工具来实现,它们合在一起形成了一个完整的工具集。同时编译过程又是一个有先后顺序的流程,牵涉到工具的使用顺序,每个工具按照先后关系串联在一起,形成了一个编译工具链。
交叉编译工具链就是为了编译跨平台体系结构的程序代码而形成的由多个子工具构成的一套完整的工具集。同时,它隐藏了预处理、编译、汇编、链接等细节,当我们指定了源文件(.c)时,它会自动按照编译流程调用不同的子工具,自动生成最终的二进制程序映像(.bin)。
注意:严格意义上来说,交叉编译器,只是指交叉编译的gcc,但是实际上为了方便,我们常说的交叉编译器就是交叉编译工具链
1.3 交叉编译工具链命名规则
在使用交叉编译链时,常常会看到下面这样的名字:
arm-linux-gnueabihf-
arm-none-linux-gnueabi-
arm-cortex_a8-linux-gnueabi-
mips-malta-linux-gnu-
这些交叉编译链的命名通常会遵循一定的规则:arch-vender-os-abi ,各字段说明如下:
- arch:目标cpu架构,比如mips、arm、x86、riscv等,该字段通常不会省略
- vendor:提供此编译工具链的厂商名称或是厂商特定信息,该字段只是标识信息,没有实际意义,可以为none、cross、unknow或是直接省略
- os:目标设备上运行的操作系统,常见的有linux、none(裸机)等
- abi:应用程序二进制接口(Application Binary Interface),交叉编译链所选择的库函数和目标映像的规范,该字段常见的值有abi 、eabi(embedded abi)、gun(glibc+oabi)、gnueabi(glibc+eabi)、gnueabihf(hf 指默认编译参数支持硬件浮点功能)等
二、Ubuntu 下搭建 GCC 交叉编译工具链
Ubuntu自带的gcc编译器是针对X86架构的,但是我们要编译的是ARM架构的代码,所以需要一个在X86架构PC上运行,可以编译ARM架构代码的交叉编译器。
2.1 下载交叉编译器
本文使用Linaro出品的交叉编译器, Linaro是一间非营利开放源代码软件工程公司,最著名的就是Linaro GCC编译工具链(编译器),其官网可以下载源码
Linaro 网站提供了很多种 GCC 交叉编译工具链,因为我们使用的是一个 Cortex-A7 内核的开发板,因此选择 arm-linux-gnueabihf,再根据32/64位系统下载不同版本的编译器,这里选择下载x86_64版本
2.2 安装交叉编译器
在 Ubuntu 中创建目录:/usr/local/arm
sudo mkdir /usr/local/arm
将下载好的交叉编译器复制到该目录中
sudo cp gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/arm/ -f
拷贝完成后在该目录中对交叉编译工具进行解压
sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
打开/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
2.3 交叉编译器验证
使用以下命令查看交叉编译工具的版本号,若安装正确就会显示版本号
arm-linux-gnueabihf-gcc -v
从上图可以看出当前交叉编译器的版本号为 4.9.4,说明交叉编译工具链安装成功。使用交叉编译器的命令一般是arm-linux-gnueabihf-gcc
|