05-树莓派-交叉编译
交叉编译的概念
交叉编译是什么
来源百度百科:
交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。
简单说就是在一个平台上生成另一个平台上的可执行代码
为什么要交叉编译
- 有时候平台上不允许或不能够安装我们所需要的编译器
- 目的平台上的资源贫乏,无法运行我们所需要的编译器
交叉编译需要用什么工具
交叉编译器、交叉编译工具链
树莓派交叉编译工具链的安装
安装工具链
树莓派官方下载网址:https://github.com/raspberrypi/
交叉工具链下载链接:https://github.com/raspberrypi/tools.git
下载工具链
方法一:
搜索tools,找到tools工具
之后下载完成之后导入到ubantu系统之中即可
下载完之后,自己找一个文件夹,解压出来。
输入命令unzip tools-master.zip
进入文件目录
进入目录:/tools-master/arm-bcm2708
我们先进入解压出来的目录,通过ls
命令我们可以看到,里面有很多。
如果我们的Ubuntu系统使用的64位系统则进入,图片中的目录:gcc-linaro-arm-linux-gnueabihf-raspbian-x64
进入该目录中的bin目录当中:
cd gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/
我们可以看到很多:
我们需要使用的工具是arm-linux-gnueabihf-gcc
该玩意是一个软连接,我们通过ls -l
可以查看到具体情况。
配置环境变量
配置环境变量分为两种,
临时环境变量:只在当前命令窗口有效,换个窗口就无效了。
永久环境变量:任何页面都行
配置临时环境变量
- 我们可以通过命令
echo $PATH
查看环境变量
- 使用
pwd
命令可以查看到我们当前路径
$ pwd
/home/pi/smp_tools/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
- 使用
export PATH=$PATH:路径
添加环境变量
export PATH=$PATH:/home/pi/smp_tools/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
arm-linux-gnueabihf-gcc -v
检测是否配置成功
配置永久环境变量
- 修改工作目录下.bashrc隐藏文件
将上方临时配置环境变量的命令添加在文件中。
export PATH=$PATH:/home/pi/smp_tools/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
- 使用source 命令立马加载配置文件
source .bashrc
交叉编译
常规编译我们使用gcc
,交叉编译,我们使用arm-linux-gnueabihf-gcc
编译
随便写一段程序进行测试。
pi@pi-virtual-machine:~/smp_test$ gcc hello.c
pi@pi-virtual-machine:~/smp_test$ arm-linux-gnueabihf-gcc hello.c -o v
pi@pi-virtual-machine:~/smp_test$ ls
a.out hello.c v
pi@pi-virtual-machine:~/smp_test$ ./v
bash: ./v: cannot execute binary file: Exec format error
pi@pi-virtual-machine:~/smp_test$ gcc hello.c
pi@pi-virtual-machine:~/smp_test$ arm-linux-gnueabihf-gcc hello.c -o b.out
pi@pi-virtual-machine:~/smp_test$ ls
a.out b.out hello.c v
pi@pi-virtual-machine:~/smp_test$ file a
a: cannot open `a' (No such file or directory)
pi@pi-virtual-machine:~/smp_test$ file a.out
a.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=7a90285756e892dff6f6f06e8372b28a37c8af04, for GNU/Linux 3.2.0, not stripped
pi@pi-virtual-machine:~/smp_test$ file b.out
b.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.26, BuildID[sha1]=42dfeee4f03eab86ab6b259df78aefc782fe1d64, not stripped
带wiringPi库的交叉编译
我们在进行树莓派开发的时候,很多是使用了wiringPi的,编译这种程序的时候,由于我们Ubuntu系统中未安装wiringPi导致无法编译成功,所以我们需要先交叉编译WiringPi。
官方地址:https://github.com/WiringPi/WiringPi
- 下载编译wiringPi库
可使用命令https://github.com/WiringPi/WiringPi.git
进行安装,网络不好可下载我提供下载链接。 - 安装
但是,这样子我们编译出来的wiringPi是基于X86的,我们无法编译成功。
下载树莓派中的WiringPi
我们进入树莓派中,下载树莓派中的WiringPi。
- 使用命令
cd /usr/lib
进入树莓派WiringPi文件路径
我们可以看到wiringPi库
- 将WiringPi复制到虚拟机
scp /usr/local/lib/libwiringPi.so.3.10 pi@192.168.174.249:/home/pi/smp_wiringpi
- 在虚拟机中创建软连接
ln -s libwiringPi.so.3.10 libwiringPi.so
相关链接
看这篇吧,干不下去了:https://blog.csdn.net/v13111329954/article/details/142673904