交叉编译——相关概念

一、交叉编译概念

在说交叉编译之前 我们先了解什么是本地编译:

1.什么是本地编译?

编译就是在一个平台生成该平台上的可执行代码

编译就是比如你在 Ubuntu Linux 中 编写了 a.c 的代码,我们 gcc a.c 就是编译,这样==会生成可执行程序 a.out == 我们 ./a.out 就运行了改程序。这个应该都能理解。

2.什么是交叉编译?

交叉编译是在一个平台上生成另一个平台上的可执行代码。 同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
举例:
**1.**我们在Windows上面编译C51的代码,并编译成可执行代码,如== xx.hex 是在C51运行,C51内存很小,根本不能够编译代码和编译代码,没办法有编译器工具不是在Windows 上运行

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

二、为什么要交叉编译?

平台不允许或者不能够安装我们所需要的编译器 而我们又需要这个 比如C51。
1.目的平台上的资源贫乏,无法运行我们所需要编译器

2.目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。

3.速度:目标平台的运行速度往往比主机慢得多,许多专用的嵌入式硬件被设计为低成本和低功耗,没有太高的性能

4.功能:整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存或磁盘空间

5.可用性:即使目标平台资源很充足,可以本地编译,但是第一个在目标平台上运行的本地编译器总需要通过交叉编译获得

6.灵活性:一个完整的Linux编译环境需要很多支持包,交叉编译使我们不需要花时间将各种支持包移植到目标板上

平台运行至少要两样东西:
bootloader(启动引导代码)以及操作系统核心

在项目的起始阶段,目的平台尚未建立,因此需要做交叉编译,以生成我们所需要的bootloader(启动引导代码)以及操作系统核心;其次,当目的平台能启动之后,由于目的平台上资源的限制,当我们编译大型程序时,依然可能需要用到交叉编译。

树莓派是不是就不需要交叉编译?
其实也是需要交叉编译的。因为树莓派有时候也是会因为目的平台还没建立,连操作系统都没有,所以根本谈不上运行什么编译器。操作系统也是代码,也需要编译的。

三、需要工具

交叉编译器、交叉编译工具链

要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台运行的代码

常见的交叉编译例子如下

**1、**在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。

2、在Windows PC上,利用ADS(ARM开发环境),使用armcc编译器 ,则可编译出针对ARM CPU的 可执行代码

**3、**在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。

四、基础知识:

宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。

目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。

宿主机就想当于我们的电脑,目标机就相对于我们的树莓派

prefix交叉编译器的安装位置。

平台描述:xxx-xxxx-xxxxx

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

这里需要知道你目标机是什么,那么你就得下载相关的交叉编译工具链。
我这里是用树莓派,所以我得下载树莓派的工具链。

1.到官网下载

下载网址

在这里插入图片描述

2.拷贝压缩包到Linux

方式1:直接拉到Linux
**方式2:**利用一个软件filezilla进行拷贝(直接我又写博客说到的)

3.解压压缩包

指令:
unzip tools-master.zip

4.进入路径找到工具链

cd tools-master/arm-bcm2708/

在这里插入图片描述
我这里是64位
所以
cd gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/

在这里插入图片描述
这个则是我们要用到的工具链

5.配置环境变量

由于我们需要敲很多的指令才能进入到这个文件,才能找到这个工具链,这样会比较麻烦,所以我们可以通过配置环境变量来省去敲这么多指令进入。

1.临时有效(同一个终端有效但是换了一个终端就没效了)

1.echo $PATH (输出当前的环境变量)
在这里插入图片描述

2.pwd 显示当前路径
在这里插入图片描述
3.export PATH=环境变量+当前路径(看上面框选的内容)

export PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

2.永久有效

去修改.bashrc文件
.bashrc是一个隐藏文件,配置命令终端的。
1. vi .bashrc
2. 在文件最后加上 export PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
3.source .bashrc加载配置环境 立即生效

检查到 arm-linux-gnueabihf-gcc -v
如果是4.8.3的版本则是正确的。

arm-linux-gnueabihf-gcc xxx.c -o xxx
//就会生成ARM下能运行的程序了。可以运行到树莓派了
file xxx
//可以通过来查看是什么平台下的。

猜你喜欢

转载自blog.csdn.net/weixin_47457689/article/details/109651264