一、交叉编译是什么,为什么要交叉编译?
- 是什么?
交叉编译是在一个平台上生成另一个平台上的可执行代码。
我们在windows环境下编写 C51 的代码,并编译成可执行未见,例如:xx.hex
是在 C51 上运行,不是在windows上运行
我们在 Linux 上编写树莓派的代码,并编译成可执行未见,例如:a.out
是在树莓派上运行,不是在 Ubuntu Linux 上运行
C51交叉编译发生在keil(集成环境)
stm32 - 为什么要交叉编译?
平台上不允许或不能够安装编译器,如:C51(内存太小)
(1)因为目的平台资源匮乏,无法运行我们需要的编译器
(2)树莓派是不是就不需要交叉编译?
错,也要。树莓派有时又是因为目的平台还没有建立(板子才出来的时候),连操作系统都没有,根本谈不上运行什么编译器。
操作系统也是代码,也需要编译
平台运行至少需要两样东西:bootloader(启动引导代码)以及操作系统核心。
宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。 - 交叉编译工需要用到什么工具?
交叉编译器、交叉编译工具链
二、交叉工具链的安装
- 因为我们是树莓派所以我们用的工具链也得是树莓派的,比如我么编译C51的工具链是keil,所以不同的平台用的交叉编译工具链是不一样的。
树莓派的交叉编译工具链下载地址:
https://github.com/raspberrypi/
点击tool,tool就是工具链的意思
- 然后复制到Linux
- 然后输入以下命令解压:
unzip tools-master.zip
- 解压后进入 cd tools-master/arm-bcm2708,根据自己虚拟机的位数选择进入不同的文件夹
- 进入后 再进入 bin/ 文件夹
- 然后ls -l会看见以下
我们要安装的就是这个 arm-linux-gnueabihf-gcc ,这是个软链接,它只是一个符号指向这个arm-linux-gnueabihf-gcc-4.8.3,不消耗内存。
- 直接运行 arm-linux-gnueabihf-gcc
8.配置环境变量:但这样只能在这个目录下使用,那么我们怎么不用进入这个目录就可以使用呢,我们只需要将它放进环境变量就可以了
echo $PATH //显示环境变量 ,echo 是显示当下环境变量
我们用 pwd 指令显示 arm-linux-gnueabihf-gcc 所在目录然后将它放入环境变量,export game:前面的加上 pwd 的地址。然后就这可以在任何目录都可以调用
但这种方法只是临时有效,再开一个命令终端就不行了。
永久有效的方法:修改工作目录下的.bashrc 隐藏文件,.bashrc是配置命令终端的
在文件最后一行加入:
export PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/shumeiPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
加入你刚才export加入的那行
然后再命令终端输入:
source /home/CLC/.bashrc //加载配置文件,马上生效配置
三、带wiringPi库的交叉编译如何进行
正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译程序的时候,链接库的格式也是正确的。
因为下载的wiringPi 库的包不好所以不展示,我们直接将树莓派上的 wiringPi 库传到 PC 上
在终端输入
scp libwiringPi.so.2.50 pi@192.168.1.6:/home/pi/
指令 文件名 开发板用户名@开发板地址:开发板的绝对路径
我们将它变成以一个软链接这样方便点
ln -s libwiringPi.so.2.50 libwiringPi.so
四、软链接、硬链接(面试用)
参考文献:https://www.cnblogs.com/zhangna1998517/p/11347364.html
- 软链接
(1)软链接文件有类似于Windows的快捷方式。
(2)在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
(3)它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间。 - 硬链接(不常用)
硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
这 里有两点要注意:
第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;
比如:我创建了软链接 libwiringPi.so.1、libwiringPi.so.2、libwiringPi.so.3,改动他们其中一个每一个都会变
第二,ln的链接有软链接 和硬链接两种,软链接就是ln -s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还
是硬链接,文件都保持同步变化。