一、交叉编译是什么,为什么要交叉编译
1、什么是交叉编译
交叉编译
交叉编译可以理解为:在当前编译平台上生成另一个目标平台上的可执行代码,但是编译平台本身却不能运行该程序。
比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。
本地编译
是指编译源代码的平台和执行源代码编译后程序的平台是同一个平台。
2、为什么要交叉编译?
1. 交叉编译的目标系统一般都是内存较小、显示设备简陋甚至没有,没有能力在其上进行本地编译,无法运行我们所需要编译器;
2. 有能力进行源代码编译的平台CPU架构或操作系统与目标平台不同;
平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。
如:在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
二、交叉编译工具链的安装
- OrangePi_Zero2交叉编译工具链安装
详情参考OrangePi_Zero2用户手册Orange Pi Zero2-Orange Pi官网-香橙派(Orange Pi)开发板,开源硬件,开源软件,开源芯片,电脑键盘
- 树莓派交叉编译工具链安装
下载地址:https://github.com/raspberrypi/
unzip tools-master.zip 解压
cd /home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
pwd获得路径
echo $PATH 获得当前环境变量的值
2.1 临时有效,配置环境变量
PATH 环境变量
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
2.2 永久有效,配置环境变量
修改工作目录下的.bashrc 隐藏文件,配置命令终端的
vi /home/CLC/.bashrc
在文件最后一行加入:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
source /home/CLC/.bashrc 加载配置文件,马上生效配置。
三、交叉编译
检查下交叉编译工具对不对:
arm-linux-gnueabihf-gcc -v
编译:
arm-linux-gnueabihf-gcc xxx.c -o xxx
把编译生成的可执行文件下载到开发板:
scp clientInPi pi@192.168.43.30:/home/pi
指令 文件名 开发板用户名@开发板地址:开发板的绝对路径
四、带wiringPi库的交叉编译如何进行
1. 正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的试试,链接库的格式也是正确的。
2. 通过-I -L来指定
arm-linux-gnueabihf-gcc demo.c -I /home/CLC/lessonPI/WiringPi/wiringPi -L. -lwiringPi
把树莓派的wringPI库拿上来用