树莓派基础之交叉编译

发布于:2022-12-27 ⋅ 阅读:(281) ⋅ 点赞:(0)

一、交叉编译的概念

1.交叉编译是什么?
编译:是在一个平台上生成该平台上的可执行代码。

交叉编译:是一个平台上生成另一个平台上的可执行代码。

比如:我们在windows上编写C51代码,并编译成可执行代码,如xx.hex,是在C51上面运行,而不是在windows上面运行。

再比如:我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行,而不是在ubuntu上面运行。

2.为什么要交叉编译?
1)平台上不允许或者不能安装我们所需要的编译器,比如C51

2)因为目的平台上的资源匮乏,无法运行我们所需要的编译器

3.树莓派是不是就不需要交叉编译?
错,也要。树莓派有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。操作系统也是代码,也需要编译

平台运行至少需要两样东西:bootloader(启动引导代码) 以及操作系统核心

宿主机(host):编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行的代码在target上运行。

4.交叉编译需要的工具是什么?
交叉编译器和交叉编译工具链。

二、交叉编译工具链的安装

1.下载网址
在这里插入图片描述
在这里插入图片描述
2.下载完后,把压缩包从共享文件夹拷贝或者拖拽到ubuntu下,然后解压:
在这里插入图片描述

解压后,我们一层一层进入目录找到需要的工具:
在这里插入图片描述
查看可执行权限:
在这里插入图片描述
红色框里面的蓝色可执行程序是软链接,它不占内存,指向后买你的绿色文件。

我们废好大力气才找到需要的工具,藏得太深了,我们要改下这个工具的环境变量,这样我们用该工具的时候就不用找这么长的路径了。

3.配置PATH(环境变量)
echo $PATH 获得当前环境变量的值

pwd 显示当前路径

临时有效:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/free/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

仅该窗口有用
在这里插入图片描述

永久有效:
修改工作目录下的.bashrc 隐藏文件。该文件是配置命令终端的。
在这里插入图片描述

source /home/free/.bashrc
//source:立马生效配置文件

三、交叉编译

file xxx文件:查看xxx文件的属性
在这里插入图片描述
这就是用了树莓派交叉编译工具和没用的区别,用了就只能在树莓派平台上运行。

交叉编译步骤:
检查下交叉编译的工具对不对:

arm-linux-gnueabihf-gcc -v

在这里插入图片描述
然后把我们在ubuntu下写的代码通过该工具编译成只有arm平台可执行的文件:

先把文件交叉编译成树莓派可执行文件

arm-linux-gnueabihf-gcc xxx.c -o xxx

然后把编译生成的可执行文件远程拷贝下载到开发板:

scp xxx pi@192.168.4.104:/home/pi
指令 文件名 开发板用户名@开发板ip地址:开发板的绝对路径

四、带wiringPi库的交叉编译如何进行

当树莓派的应用场景需要用到这个wiringPi库中的功能时,我们在ubuntu上编写代码就要加上这个wiringPi库.

所以我们要在ubuntu上下载wiringPi库:
在这里插入图片描述

./build生成库文件:
在这里插入图片描述

假如要编译一个带wirinjgPi库的文件:

arm-linux-gnueabihf-gcc demo2.c -I /home/free/SYSTEM/wiringPi/wiringPi -lwiringPi

-I 指定路径查找 wiringPi.h文件

很显然编译出错,因为我们在官网下载的wiringPi链接的库格式不对,只支持X86平台的,用树莓派的交叉编译工具编译不了:
在这里插入图片描述
记住一个指令:

grep xxx * -nir
查找匹配 xxx的相关字段 在所有文件中 -行号 不区分大小写 定位每个文件
history | grep demo2.c
在历史指令中查找显示出相关demo2.c的指令字段

五、软链接

1.参考博文

2.软链接的概念:
a)软链接文件类似于windows的快捷方式

b)在符号中链接,文件实际上是一个文本文件,其中包含的有另一个文件的位置信息

c)在选定的位置上生成一个文件的镜像,不会占用磁盘空间

3.如何生成软链接:

in -s libwiringPi.so.2.50 libwiringPi.so
指令 参数 要被链接的文件 软链接文件名

4.硬链接:
如何生成:

in libwiringPi.so.2.50 libwirngPi.so
它会在你选定的位置上生成一个和源文件大小相同的文件

5.我们把树莓派的软链接和软链接源文件都远程拷贝到ubuntu,并且
in -s libwiringPi.so.2.50 libwiringPi.so 生成软链接libwiringPi.so指向源文件libwiringPi.so.2.50

这样我们就可以在ubuntu上编译带wiringPi库文件的代码了:

arm-linux-gnueabihf-gcc demo2.c -I /home/free/SYSTEM/wiringPi/wiringPi -L. -lwiringPi -o xxx文件

然后把xxx可执行文件远程拷贝到树莓派运行即可.