一、什么是交叉编译?
答:交叉编译是指在一个平台上生成另一个平台上的可执行代码。
例子1:我们在windows上编写的c51代码,并编译成可执行代码,如xx.hex文件,是在c51上运行的,不是在windows运行的。
例子2:我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行的,不是在ubuntu linux上面运行的。
编译:在一个平台是生成该平台上的可执行代码。
c51交叉编译发送在keil(集成环境上面)
二、为什么要交叉编译?
平台是不允许或不能够安装我们所需要的编译器比如C51
因为目的平台上的资源贫乏,无法运行我们所需要的编译器
树莓派是不是就不需要交叉编译?
答:错误。
树莓派有时又因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。操作系统也是代码,也要编译。
平台运行至少需要两样东西:BootLoader(启动引导代码)以及操作系统核心。
3.那么什么是宿主机(host)和目标机(target)呢?
答:宿主机:编辑和编译程序的平台,一般是基于X86的PC机。
目标机:用户开发的系统,通常都是非X86平台,宿主机编译得到的可执行的代码在目标机上运行。
三、交叉编译需要用到什么工具?
交叉编译器、交叉编译工具链。
四、树莓派交叉编译工具链的安装
1.安装地址
2.压缩包下载好了后用共享文件夹的方式复制到linux下的虚拟机,FileZilla进行文件的传输也是可以的。
3.解压指令unzip
4.解压完进入到交叉编译工具链所在的路径
我们看到很多可执行文件(绿色),和软链接(蓝色),红框内的那个软链接就是我们要用到的。
5.在获得了交叉编译工具链的软链接之后,接下来就是环境变量的配置,它有两种方式进行配置,一是临时的环境变量的配置,二是永久有效的环境变量的配置。
6.echo $PATH查看环境变量。
无论环境变量多长只要到game:就好了。
export指令加入环境变量。复制第6点查看的环境变量到game:后面接入pwd当前的路径。
这样就完成了临时环境变量的配置,这样有点不好的就是,这只是仅限这个终端窗口而已,在另一个终端这个环境变量就失效了。
7.永久有效的环境变量的配置:
首先修改工作目录下的隐藏文件.bashrc
vi /home/my(这里的my是代表你的用户名)/.bashrc
进入该隐藏文件之后,在文件的末尾添加
export PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/my/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
然后保存把并退出文件
如何加载配置文件:
使用 source /home/my(这里的my是代表你的用户名)/.bashrc 命令加载配置文件,马上生效配置。
五、交叉工具编译链的使用
对比gcc和arm-linux-gnueabihf-gcc编译后的不同,由图可知gcc可以编译后只能在电脑X86-64运行,而另一个方式编译可以在ARM下运行,并且它们都是可执行文件。
补充:file是用来查看文件属性。
检查交叉编译工具对不对:
arm-linux-gnueabihf-gcc -v
版本4.8.3
如何把编译生成的可执行文件下载到开发板:
scp clinentPi pi@192.168.1.78:/home/pi
指令 文件名 开发板用户名@开发板地址:开发板绝对路径
这样就完成了test_2的传输。
我们来运行一下,
运行也是ok的。
六、如何用带wiringpi库进行交叉编译
a.首先我们要明白在虚拟机上本来是没有wiringPi库的,所以当我们要在虚拟机上使用这个库的时候,我们要对这个库进行安装。
提取码:2j5k
b.下载完把它安装在虚拟机里,在虚拟机解压。
-rf:强制递归复制
-r:若给出的源文件是一个目录文件,此时将复制该目录底下所有的子目录和文件
-f:覆盖已经存在的目标文件而不给出提示
没有则错误提示cp: omitting directory(删除目录)
c.解压后一般先看INSTALL和README.TXT这个两个文件。
打开查看README.TXT,里面显示的是下载地址。
打开查看INSTALL
./build进行安装,安装生成的位置在/usr/local/lib上
安装完后我们来查看是不是真的在这里路径上。
显然确实有,说明我们安装成功了。
d,我们来尝试编译一下。
拿取以前我们树莓派写的代码。
显示报错:头文件不认识。
首先找到头文件的位置
现在编译完出现了不认识这些函数的报错。
与树莓派编译报错一致,但是在树莓派里加入-lwiringPi后能解决,而在虚拟机却得不到解决。
这是为什么呢?
e.继续上面的问题,我们来查看库的内容。
由此可见该库只能用在x86,而因为我们要使用的编译工具链(arm-linux-gnueabihf-gcc)是在ARM下使用的,这个编译器不认识这个库。因此无法编译.
总结:正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的时候,链接库的格式也是正确的。
学习笔记,仅供参考。
如何解决问题,请看下一篇博文