交叉编译详解

交叉编译详解


注意:本文开发的平台 - - - 树莓派。


一、交叉编译是什么,什么是本地编译?

交叉编译是:是在一个平台上生成另一个平台上的可执行代码。
举例说明:我们在Windows中keil中编写C51代码,编译生成可执行代码生成 xxx.hex文件,xxx.hex文件是运行在51单片机上面,在Windows下并不能执行。

C51交叉编译发生在keil集成IDE中

本地编译是:是在当前平台下编译生成在当前平台上的可执行代码。

二、为什么需要交叉编译?

需要交叉编译的理由如下:

  1. 平台上不允许或不能够安装我们所需要的编译器,C51就是最好的例子
  2. 目的平台上的资源贫乏,无法运行我们所需要编译器
  3. 即使目的平台资源充足也是需要交叉编译,考虑到编译的速度问题

问:树莓派可以运行Linux系统,资源也比较充足,是不是可以不用交叉编译呢?
答:错,树莓派的开发也需要交叉编译。

三、交叉编译需要使用用到什么工具?

交叉编译需要用到两个工具:

  1. 交叉编译器。
  2. 交叉编译工具链。

需要安装交叉编译工具链才可以使用交叉编译器,下面我们就来安装装交叉编译工具链。

四、交叉编译工具链的安装

交叉编译工具下载需要的文件下载地址:tools-master.zip

下载完毕,需要把压缩包搬运到虚拟机,可以是使用一下两种方式:

  1. 把压缩包从共享文件夹拷贝到工作目录

cp /mnt/hgfs/share/tools-master.zip .

2.使用 FileZilla,进行传输。

将传输过去的压缩包解压:

unzip tools-master.zip

此时我们去到我们使用的工具链目录下

cd /home/cjh/pi/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
pwd获得路径

怎么样配置我们才能使用交叉编译器?

答案:当然是配置环境变量!!!

配置环境变量需要注意,一种是临时配置的环境变量,另一只是永久配置的环境变量。
下面就来演示两种配置环境变量的方法:

1.临时环境变量(仅限在我们配置的终端窗口中使用)

使用 export 指令添加

export PATH=$PATH:/home/cjh/pi/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

注意:此环境变量是临时的,只能在当前终端使用,关闭当前终端后就会被回收。

2.永久环境变量(需要修改工作目录下的隐藏文件)

vi /home/cjh/.bashrc
在文件的最末尾添加,下面指令
export PATH=$PATH:/home/cjh/pi/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
添加完成后需要重新加载配置文件,加载后环境变量就生效了
source /home/cjh/.bashrc

怎么样验证是否配置好呢

使用下面方式验证:

arm-linux-gnueabihf-gcc -v
看到版本号为:4.8.3

此时我们就可以开始交叉编译了。

arm-linux-gnueabihf-gcc xxx.c -o xxx

编译好后,可以通过下面指令传输到树莓派验证

scp xxx [email protected]:/home/pi

五、带wiringPi库的交叉编译如何进行?

首先,我把wiringPi库传到了树莓派平台,正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的试试,链接库的格式也是正确的。
我执行下面指令发现

arm-linux-gnueabihf-gcc demo2.c -I /home/CLC/lessonPI/WiringPi/wiringPi -lwiringPi // -I 时指定在哪里找需要的文件
执行后报错
/home/cjh/pi/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/…/lib/gcc/arm-linux-gnueabihf/4.8.3/…/…/…/…/arm-linux-gnueabihf/bin/ld: cannot find -lwiringPi
collect2: error: ld returned 1 exit status

发现行不通,然后我就直接把树莓派上的库拿过来使用
此时就需要先了解软链接和硬链接的知识,下面进行简介:
软链接概念:
1. 软链接文件有类似于Windows的快捷方式。
2. 在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
3. 你选定的位置上生成一个文件的镜像,不会占用磁盘空间

硬链接概念:
1. 硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。
2. 硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。 其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

软链接的生成:

ln -s libwiringPi.so.2.50 libwiringPi.so

硬链接生成:

ln libwiringPi.so.2.50 libwiringPi.so

注意:

  1. 软链接不生成新的文件,而是文件的位置信息,占用空间小。
  2. 硬链接会在选定的位置上生成一个和源文件大小相同的文件。

参考文章:
1.https://www.cnblogs.com/zhangna1998517/p/11347364.html
2.https://blog.csdn.net/pengfei240/article/details/52912833

猜你喜欢

转载自blog.csdn.net/weixin_51363326/article/details/116244133