一、什么是交叉编译
交叉编译指在一个平台上生成另一个平台可执行的代码。比如我们学51的时候,在Windows上生成 .hex 十六进制文件,下载给51单片机执行,而交叉编译的过程发生在Keil软件或在IAR软件上。其实交叉编译早在我们学51的时候就涉及到了,只是我们不太去关注这些东西。
二、为什么要交叉编译
至于为什么要交叉编译,主要有两个原因;
1. 目标平台上不能够安装或者运行编译器,需要在带有编译器的平台进行交叉编译。比如51单片机和一些32位的单片机,连个gcc 都装不了,就需要交叉编译;
2. 目标平台还没有操作系统,没办法自主安装编译器。比如没有操作系统的树莓派,就需要交叉编译来生成内核系统。
因此,树莓派也是需要交叉编译的,因平台的运行至少需要bootloader 和系统核心。
宿主机和目标机
宿主机(host): 编译和编译程序的平台,一般是X86的PC机,也称为主机;
目标机(targer): 用户开发的系统,通常是非X86的平台,host上编译得到的可执行代码在targer上运行。
两者的关系 就和Windows开发51单片机一样,Windows便是宿主机host,51芯片就是目标机 targer。
三、交叉编译工具链的安装
先下载交叉编译工具,可以去github上下载:https://github.com/raspberrypi/tools,点击“Code” 下的“Download ZIP”,如果嫌弃下载慢的话,也可以下载我的资源: 交叉编译工具。
下载完之后,先重命名一下,把中文都删了,然后放到虚拟机中,最好放到工作目录。使用
unzip tools-master.zip
来解压,解压好之后应该是有个 tools-master 文件夹,我把它移到了隐藏文件中,所以我的文件夹是 .tools-master
交叉编译工具链 “arm-linux-gnueabihf-” 就在 tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin 目录下:
交叉环境变量的配置
为了方便且长久地使用交叉编译工具链 “arm-linux-gnueabihf-”,需要对PATH环境变量进行配置。在工作目录下打开 .bashrc文件,在文件最后加入:
xport PATH=$PATH:/home/seahi/Desktop/Linux/.tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
这个路径各不相同,可以在 “arm-linux-gnueabihf-” 所在目录 用“pwd”指令获得该目录,使用
arm-linux-gnueabihf-gcc -v
来判断是否安装完成:
能出来这样地信息,证明交叉编译工具链安装完毕。
四、交叉编译树莓派运行地程序
我之前写过一个小型FTP文件服务器程序,它在虚拟机的运行结果是这样的:
支持服务器支持多客户端下载和上传文件,浏览文件,和获取路径。现在我把客户端交叉编译到树莓派运行:
使用 **“scp pi@树莓派的ip地址:树莓派已有的路径”**发送到树莓派。看一下运行结果:
树莓派的交叉编译还会涉及到动态库,但是动态库的编译我还没学,以后学深入的时候,我在写博客记录一下。