1. 交叉编译是什么,为什么要交叉编译:
我们先来看看什么是编译,它是在一个平台上生成在该平台上的可执行代码。
而交叉编译 是在一个平台上生成另一个平台上的可执行代码。例如我们再windows上面编写C51代码,并编译成可执行代码,如xx.hex,这是在c51上面运行,而不是在windows上面运行。另一方面我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,这是在树莓派上面运行,而不是在ubuntu linux上面运行。
2.我们为什么要使用交叉编译:
有时候平台上不允许或不能够安装我们所需要的编译器比如C51,或者因为目的平台上的资源贫乏,无法运行我们所需要编译器
树莓派本身拥有较大的空降是不是就不需要交叉编译了?
答案是否定的,也是需要的,树莓派有时因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器,而操作系统也是代码,也要编译,因而也离不开交叉编译,而平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心
宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。
3.交叉编译需要用到什么工具:
交叉编译器、交叉编译工具链
4.交叉编译工具的下载与安装:
链接:https://pan.baidu.com/s/1m3PTWQLi7Fp9Zt2eiM7T-A
提取码:42c9
(这是百度网盘链接,下载的是压缩包)
下载之后将压缩包移入虚拟机中,可使用共享文件夹,也可直接拖拽
然后在压缩包的目录下 解压
unzip tools-master.zip (输入这个命令,liunx下解压缩的命令)
cd /home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin(解压之后依次进入这些文件目录,前面的是根目录,可根据自己的目录来设定)
这时如果我们要使用这个交叉编译工具,必须在这个目录下才能使用,但是我们不想这样,因而可以通过配置环境变量来使得在任意一个目录下都可以使用这个交叉编译工具。
pwd获得当前路径
echo $PATH 获得当前环境变量的值
临时有效,配置环境变量,将获得的路径和编译工具所在的路径结合起来,这样就配置好了临时环境变量,但是它只能在这个终端中使用,一旦我们打开另一个终端,那么就会失效,下面还会介绍永久生效的方法。
PATH 环境变量
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
输入 arm-linux-gnueabihf-gcc -v查看环境变量是否配置成功
当看到下方的4.8.3版本号即证明我们已经成功的安装了交叉编译工具
下面来介绍永久有效配置环境变量的方法:
修改工作目录下的.bashrc 隐藏文件,配置命令终端的
vi /home/CLC/.bashrc (输入此命令,即可进入这个文件)
然后 在文件最后一行加入:
export
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
然后再在命令端输入以下指令,即可马上生效:
source /home/CLC/.bashrc 加载配置文件,马上生效配置。
接下来我们就可以使用这个交叉编译工具了,下面看看实际使用效果:
可以看到我们用交叉编译工具编译后的可执行程序a是能在ARM平台上运行的,而我们的虚拟机是x86平台的,这样子我们就完成了交叉编译。