1.交叉编译的概念
- 什么是交叉编译?
在一个平台上编译生成另一个平台上的可执行代码
如:
1. 在window上编写C51的代码并编译成可执行文件,但放在了C51单片机上运行而不是放在在window上运行。
2.在ubuntu上编写树莓派的代码并编译成可执行文件,是在树莓派上运行,不是在Ubuntu上运行。
- 为什么要交叉编译
1.平台上不允许或不能安装我们所需的编译器
2.目的平台的资源贫乏无法运行我们所需的编译器
3.目的平台未建立,连操作系统都没有,根本谈不上运行编译器
2.交叉编译工具链的安装
1.下载工具链:raspberrypi/tools (github.com)
2.把下载的包放到 ubuntu 上,并解压:
unzip tools-master.zip
解压完毕得到文件:
3.进入到 /home/clc/SYSTEM/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin 目录下:
arm-linux-gnueabihf-gcc 就是我们要找的交叉编译工具
此时我们只能在这个目录中进行编译,为了让编译工具能在其他目录中进行编译,需要配置环境变量。
4.配置环境变量
- echo $PATH 显示当下的环境变量值
- pwd 显示交叉编译工作的路径(/home/clc/SYSTEM/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin)
- 配置环境变量:
export PATH = 当下的环境变量值+交叉编译工作的路径
配置完成后,我们就能在其他目录中进行编译。此时只能在这个窗口进行编译,当我们重新打开一个新的窗口又不能在其他目录中编译了。为了让编译工具能永久有效的在其他目录中进行编译,需要修改工作目录下的 .bashrc 隐藏文件
vi /home/clc/.bashrc
在文件的最后加上配置好的环境变量
修改好之后,生效一下配置:
source /home/clc/.bashrc // 加载配置文件,马上生效配置
这样,不管我们打开多少个窗口都可以在其他目录中使用交叉编译工具。
3.交叉编译的使用
1.检查交叉编译工具
arm-linux-gnueabihf-gcc -v (4.8.3的版本)
2.交叉编译
arm-linux-gnueabihf-gcc xxx.c -o xxx
3.把编译生成的可执行文件发到树莓派上
scp clientInPi pi@192.168.100.3:/home/pi
指令 文件名 开发板用户名@开发板地址:开发板的绝对路径
4.带wiringPi库的交叉编译如何进行
正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序,链接库的格式也是正确的。
通过
![]()
来指定
但现在因为链接的库的格式不对,格式是宿主机(X86)的平台,使用时出现以下错误 :
所以需要把树莓派的wiringPi的库拿过来用。
1. 使用scp指令将树莓派的 wiringPi 库传到 ubuntu上
scp /usr/lib/libwiringPi.so.2.50 clc@192.168.100.3:/home/clc/pi
2. 将库传到树莓派之后,为其创建软链接
ln -s libwiringPi.so.2.50 libwiringPi.so
3. 交叉编译得到ARM平台的可执行程序
arm-linux-gnueabihf-gcc relay.c -I /home/clc/PI/WiringPi/wiringPi -L ./ -lwiringPi -o armpi