一、什么是交叉编译
交叉编译(cross compilation)是指在一种体系结构的计算机上生成另一种体系结构的可执行程序。这通常用于嵌入式系统、移动设备和其他资源受限的环境,其中目标平台与主机平台不同。例如:我们在Ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行的,不是在Ubuntu Linux上面运行。
二、为什么需要交叉编译
1.目标设备与开发设备的架构或操作系统不同
目标设备与开发设备的架构或操作系统不同,例如,在开发者的主机上使用 x86 架构和 Linux 操作系统进行开发,但目标设备是 ARM 架构的嵌入式设备,这就需要使用 ARM 架构的交叉编译工具链来进行交叉编译。
2.目标设备计算资源受限
目标设备计算资源受限,由于嵌入式设备上计算资源受限,导致本地编译进行缓慢,此时就需要借助算力更强大的开发设备来提高编译效率。
三、交叉编译工具链的安装
打开Raspberry Pi · GitHub搜索tools,然后将压缩包tools-master.zip下载到本地。
再将tools-master.zip放到Ubuntu上,cp到工作目录下解压。
unzip tools-master.zip
四、配置环境变量
使用交叉编译工具链之前需要配置环境变量,一种是临时配置,一种是永久配置。
1.临时配置
unzip tools-master.zip //解压后获得 tools-master 文件夹
cd tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
//切到 bin 目录下
echo $PATH //获取当前环境变量的值
pwd //获取当前路径
export PATH=echo $PATH:pwd //将前两次的结果用冒号相连
2.永久配置
修改工作目录下的 .bashrc 隐藏文件
cd //切回工作目录
vi .bashrc //打开隐藏文件
//将export PATH=$PATH:pwd添加到最后一行,然后保存退出
source .bashrc //加载配置文件
运行以下指令用来检查,出现对应信息说明成功。
arm-linux-gnueabihf-gcc -v
五、带 wiringPi 库的交叉编译
先试一下交叉编译,运行指令。
因为虚拟机原来是没有WiringPi库的,需从网上下载。
wiringPi 库下载地址: WiringPi · GitHub
然后将压缩包 WiringPi-master.zip 放到虚拟机工作目录下。
unzip WiringPi-master //解压
cd WiringPi-master
./build // 安装wiringPi库,库文件会放到 /usr/local/lib/ 目录下
// 头文件 wiringPi.h 位于 /WiringPi-master/wiringPi/ 目录下
运行编译指令。
arm-linux-gnueabihf-gcc switchDemo.c
这里报错是因为提示找不到 头文件<wiringPi.h> ,现在加上头文件。
arm-linux-gnueabihf-gcc switchDemo.c -I ./WiringPi-master/wiringPi
//-I 加上头文件所在目录
现在报错是因为“没有链接wiringPi库”,然后我们链接上库。
arm-linux-gnueabihf-gcc switchDemo.c -I ./WiringPi-master/wiringPi -L /usr/local/lib/ -lwiringPi -o switch
依旧无法编译成功,因为这里的wiringPi库还是针对于x86设备的,而我们想要编译出的是运行在arm设备上的程序 。
(此处 file 命令用于检测文件类型)
file /usr/local/lib/libwiringPi.so.2.70
这里取巧一下,直接把树莓派库拿过来。
scp /usr/lib/libwiringPi.* eva@192.168.10.115:/home/eva/mydemo
然后再将 libwiringPi.so 与 libwiringPi.so.2.50 软链接起来,就可以正式编译了。
虽然我们用到的是libwiringPi.so,但是在树莓派中libwiringPi.so是通过软链接来指向libwiringPi.so.2.50的,所以真正用到的是libwiringPi.so.2.50。
执行软链接命令。
ln -s libwiringPi.so.2.50 libwiringPi.so
出现报错,此时把参数 -s 改为 -sf ,意思是强制执行,也就意味着如果不存在就执行创建,存在就执行覆盖掉。
至此,软连接创建完成,执行编译指令。
arm-linux-gnueabihf-gcc switchDemo.c -I ./WiringPi-master/wiringPi -L . -lwiringPi -o switch
生成switch可执行文件,通过scp命令发送到树莓派。
scp switch pi@192.168.10.112:/home/pi
再查看是否能正常运行。
六、软链接和硬链接
参考博文:Linux创建连接命令 ln -s创建软连接 - 张娜nana - 博客园 (cnblogs.com)
软链接(Symbolic Link)和硬链接(Hard Link)都是用来创建文件系统中的链接的概念。
软链接又称之为符号连接(Symbolic Link)。类似于Windows的快捷方式。在选定的位置上生成一个文件的镜像,不会占用磁盘空间,包含有位置信息。当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接它就可以,不必重复的占用磁盘空间。
用法:ln -s /path/to/真正指向的目标文件名 链接文件名
硬链接就是在选定的位置上生成一个和源文件大小相同的文件,作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。
用法:ln /path/to/真正指向的目标文件名 链接文件名
七、其他
巧用管道
例如:
ls /usr/lib/|grep libw
以指令 ls /usr/lib/ 而得到的结果作为源,流入管道中,来寻找与 "libw" 匹配的文件。