1.交叉编译是什么,为什么要交叉编译
- 编译:在一个平台上生成在该平台上的可执行代码
- 交叉编译:在一个平台上生成在另一个平台上的可执行代码
- 交叉编译的例子:如51单片机的可执行代码(hex文件)是在集成环境keil上面编译完成的,我们只需要将编译好的可执行代码下载到51单片机上即可运行
- 要使用交叉编译的原因:
(1)目的的平台上的资源贫乏,无法运行或安装我们所需的编译器
(2)有时因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器
(3)平台的运行至少需要的两样东西:bootloader(启动引导代码)和操作系统核心,这两样东西也是代码,同样需要进行编译为可执行代码才可运行,而此时原平台根本不支持编译,同样需要在其他平台上编译好可执行代码
2.交叉编译中的基础知识
- 宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。
- 目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。
- 交叉编译需要用到的工具:交叉编译工具链
3.交叉编译工具链
- arm32位:百度网盘链接:https://pan.baidu.com/s/1tw1SYXdJ2n0olry9SSc3gg
提取码:xfjs
这是要编译为arm32位的系统能运行的代码的交叉工具链接 - arm64位:百度网盘链接:https://pan.baidu.com/s/14H-Xg31wVlidk_RwCLJrUg
提取码:xfjs
或者到这个链接:aarch64下载下面这个压缩包
gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz
4.安装交叉编译工具链
- 将下载好的压缩包通过ftp文件传输软件传到ubuntu中去,我用的是filezilla软件,这个软件免费好用,直接网上下载即可
- 解压压缩包
tar -xvf gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz
得到如下文件夹
- 进入到交叉编译工具链的bin目录下
cd gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin
然后查看交叉编译的工具版本看是否安装好
./aarch64-linux-gnu-gcc -v
出现上图所示的版本号后,表示我们此时的交叉编译工具是可以使用了的,但是因为没有配置环境变量,我们此时只能在这个文件夹的bin目录下进行使用,非常不方便,所以要配置环境变量方便使用
- 配置环境变量
首先使用
echo $PATH
查看自己的环境变量
将现有的环境变量复制下来
然后用
pwd
查看自己当前所在交叉编译工具链的bin目录的完整路径
将这个目录也复制下来,要将这个目录加入到环境变量中
最后回到回到工作目录,打开.bashrc这个隐藏文件
vi .bashrc
在文件的后面根据自己的交叉编译工具链bin目录的位置加入环境变量,
export PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/CLC/workspace/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:/home/CLC/workspace/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin
接着输入
source /home/CLC/.bashrc
加载配置文件,马上生效配置。
这时在任意目录下输入
aarch64-linux-gnu-gcc -v
显示如下图所示,即表示交叉编译工具链安装完成了
5.交叉编译一个helloworld丢到树莓派上运行
- 编写一个test.c的文件
#include <stdio.h>int main()
{printf("hello world!\n");return 0;
}
- 交叉编译这个test.c文件
aarch64-linux-gnu-gcc test.c -o helloInArm64
此时如果在x86的平台上运行这个可执行文件就会报错
我们可以用
file helloInArm64
查看这个文件的属性
这里只显示了它是一个64位的可执行文件,但没有显示平台架构,我们将它这个可执行文件放到树莓派等相关的arm架构平台上他就会显示平台的架构
- 在树莓派上运行这个交叉编译后的文件
先使用
file helloInArm64
查看文件属性
这时就会显示平台的架构了
然后直接运行
一个交叉编译的hellworld就运行成功了
一开始我安装的交叉编译工具是arm32位的,编译出来的可执行文件也是32位的,但我放到我64位的树莓派上也一样可以运行起来