树莓派(二)交叉编译

一、什么是交叉编译

交叉编译(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" 匹配的文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值