一、交叉编译的概念
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的指令字段
五、软链接
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可执行文件远程拷贝到树莓派运行即可.