一、交叉编译是什么,为什么要交叉编译
- 交叉编译与编译
交叉编译:
是在一个平台上生成另一平台上的可执行代码。
我们在Windows上面编写C51代码,并编译成可执行代码,如xx.hex,是在51上运行,不是在Windows上面运行
我们在Ubuntu上面编写树莓派代码,并编译成可执行代码,如a.out,是在树莓派上面运行,不是在Ubuntu Linux上面运行。
宿主机(host):编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。
是在一个平台上生成在该平台上的可执行代码
- 为什么要用交叉编译
平台上不允许或不能够安装我们所需要的编译器,比如C51
因为目的平台上的资源匮乏,无法运行我们所需要的编译器
树莓派是不是就不需要交叉编译?
因为平台运行需要至少两样东西:BootLoader(启动引导代码)以及操作系统核心,所以有时因为目的平台还没有建立,练操作系统都没有,根本谈不上运行编译器,对操作系统的编译;
二、使用交叉编译前的准备
- 交叉编译工具的安装
对于pi3b以下的可以使用GitHub上官方发布的交叉编译工具;
对于pi4b来说,GitHub上的版本较低,当使用wiringPi进行交叉编译时会报错,所以需要自行进行交叉编译工具的安装。
- 环境变量的更改
进入装有交叉编译工具的可执行文件的文件夹下并显示出当前路径
![](https://img-blog.csdnimg.cn/img_convert/4555e4124ae591a6e8d02181c60f616e.png)
然后进入用户目录,并打开.bashrc文件,在最后一行添加export指令,并保存退出
export PATH=/opt/cross-pi-gcc-bin:$PATH
此时重启虚拟机或者输出source .bashrc指令加载配置文件。
此时交叉编译工具就已经准备好了,下来就进行测试
arm-linux-gnueabihf-gcc xxx.c -o xxx
交叉编译完成后将可执行文件通过scp指令传到树莓派上进行测试
scp clientInPi pi@192.168.43.30:/home/pi
指令 文件名 开发板用户名@开发板地址:开发板的绝对路径
三、带wiringPi库的交叉编译如何进行
注:当我们使用的库不属于arm架构的话,我们进行交叉编译的时候会报错
正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的试试,链接库的格式也是正确的。
由于我们的头文件、库都是使用的工作目下的,所以我们需要通过-I 指定从那个路径开始读取头文件,-L指定从那个路径开始读取库。
arm-linux-gnueabihf-gcc demo2.c -I /home/yq/lessonPI/WiringPi/wiringPi -L. -lwiringPi