我们之前常见的软件开发,都是属于本地编译:比如说ununtu下gcc的编译就是本地编译,也就是说在当前平台编译,编译得到的程序也是在本地执行。
交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。这种方法在异平台移植和嵌入式开发时非常有用。
简言之就是在一种平台上编译,编译出来的程序,是放到别的平台上运行,即编译的环境和运行的环境不一样,属于交叉的。
例子:例 1.1. 在x86平台上编译,在ARM平台上运行
一种最常见的例子就是:
在进行嵌入式开发时
手上有个嵌入式开发板,CPU是arm的
然后在x86的平台下开发,比如Ubuntu的Linux,或者是Win7
然后就需要:
在x86的平台上,(用交叉编译器)去编译你写好的程序代码
编译生成的(可执行的)程序,是放到目标开发板,arm的CPU上运行的
此所谓:在x86平台上编译,在ARM平台上运行
主要原因是:嵌入式系统中的资源太少
具体的解释就是:交叉编译出来的程序,所要运行的目标环境中,各种资源,都相对有限,所以很难就行直接的本地编译
最常见的情况是:在进行嵌入式开发时,目标平台,即嵌入式开发板,比如是最大主频200MHz的ARM的CPU,加上32M的RAM,加上1G的Nand Flash等等。在如此相对比较紧张的硬件资源的前提下,在已经运行了嵌入式Linux的前提下,是没法很方便的直接在嵌入式Linux下,去本地编译,去在ARM的CPU下,编译出来,供ARM的CPU可以运行的程序的。因为编译,开发,都需要相对比较多的CPU,内存,硬盘等资源,而嵌入式开发上的那点资源,只够嵌入式(Linux)系统运行的,没太多剩余的资源,供你本地编译。
那么我们为什么要在ubuntu上搭建树莓派交叉编译环境?
虽然树莓派的主频可达700MHz远高于一般的嵌入式系统,但相比于PC机其性能还是差些,使用交叉工具链可节约开发时间。在编译链接同等规模的代码时,PC机所用的时间应少于树莓派所用时间,通过交叉编译的方法提高效率。
【1】pc机环境 Ubuntu 14.04 amd64
请注意32位系统和64位系统存在差异,本文的程序在ubunut 14.04 amd64系统
搭建步骤:
(1)安装Git工具
(2)新建文件夹raspberrypi
(3)安装交叉编译工具
cd raspberrypi
git clone git://github.com/raspberrypi/tools.git
在该文件夹下,一共有5个不同版本的交叉编译工具
arm-bcm2708hardfp-linux-gnueabi
gcc-linaro-arm-linux-gnueabihf-raspbian
arm-bcm2708-linux-gnueabi
gcc-linaro-arm-linux-gnueabihf-raspbian-x64
arm-rpi-4.9.3-linux-gnueabihf
其中arm-rpi-4.9.3-linux-gnueabihf和gcc-linaro-arm-linux-gnueabihf-raspbian-x64是64位机器用的,每一个交叉编译工具的目录下都有bin目录进入,执行./arm-linux-gnueabihf-gcc -v可查看gcc版本。
在这里我们使用的是 gcc-linaro-arm-linux-gnueabihf-raspbian-x64 版本
(4)添加环境变量
makun@makun:~$ sudo vim ~/.bashrc
64位添加:
export PATH= P A T H : PATH: PATH:HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
添加完之后,接着执行以下指令以便立即更新当前控制台所包含的环境变量。
source .bashrc
32位添加:
export PATH= P A T H : PATH: PATH:HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
(5)简单测试
为了测试交叉工具链是否安装成功,可在控制台中输入
arm-linux-gnueabihf-gcc -v
控制台中输出内容如下,次步骤可证明交叉工具链安装完成且环境变量设置无误。
参考博客:https://blog.csdn.net/iefenghao/article/details/88815093
https://blog.csdn.net/zqixiao_09/article/details/51822943?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-15.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-15.nonecase