树莓派之交叉编译

一、什么是交叉编译?

答:交叉编译是指在一个平台上生成另一个平台上的可执行代码。

例子1:我们在windows上编写的c51代码,并编译成可执行代码,如xx.hex文件,是在c51上运行的,不是在windows运行的。

例子2:我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行的,不是在ubuntu linux上面运行的。

编译:在一个平台是生成该平台上的可执行代码。
c51交叉编译发送在keil(集成环境上面)

二、为什么要交叉编译?

平台是不允许或不能够安装我们所需要的编译器比如C51

  1. 因为目的平台上的资源贫乏,无法运行我们所需要的编译器

  1. 树莓派是不是就不需要交叉编译?

答:错误。

树莓派有时又因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。操作系统也是代码,也要编译。

平台运行至少需要两样东西: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库的,所以当我们要在虚拟机上使用这个库的时候,我们要对这个库进行安装。

wiringPi库提取

提取码:2j5k

b.下载完把它安装在虚拟机里,在虚拟机解压。

我的共享文件夹名字在D盘的5G所以文件在/mnt/hgfs/5G目录底下

-rf:强制递归复制
-r:若给出的源文件是一个目录文件,此时将复制该目录底下所有的子目录和文件
-f:覆盖已经存在的目标文件而不给出提示
没有则错误提示cp: omitting directory(删除目录)

c.解压后一般先看INSTALLREADME.TXT这个两个文件。

打开查看README.TXT,里面显示的是下载地址。

打开查看INSTALL

./build进行安装,安装生成的位置在/usr/local/lib上

安装完后我们来查看是不是真的在这里路径上。

显然确实有,说明我们安装成功了。

d,我们来尝试编译一下。

拿取以前我们树莓派写的代码。

显示报错:头文件不认识。

首先找到头文件的位置

现在编译完出现了不认识这些函数的报错。

与树莓派编译报错一致,但是在树莓派里加入-lwiringPi后能解决,而在虚拟机却得不到解决。

这是为什么呢?

e.继续上面的问题,我们来查看库的内容。

由此可见该库只能用在x86,而因为我们要使用的编译工具链(arm-linux-gnueabihf-gcc)是在ARM下使用的,这个编译器不认识这个库。因此无法编译.

总结:正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的时候,链接库的格式也是正确的。

学习笔记,仅供参考。

如何解决问题,请看下一篇博文