交叉编译:是指一个平台编译好的可执行文件,放到另一个平台去运行,例如51单片机利用keil编程这就是一个交叉编译,使用keil编译之后产生的.hex文件再利用某些工具上传到stc89c51单片机上,就可以运行我我们的51代码。
换位到Linux上,我们在虚拟机上gcc好一个文件会产生一个.a.out文件,我们将.a.out文件放到ARM-Linux平台上去执行,就是Linux的交叉编译,为什么不直接在ARM-Linux平台直接编译?搞这么麻烦?
1、成本问题,正真去公司开发并不像是学习一样那样高的ARM-Linux配置,都不足以安装gcc编译工具,或者安装好了没法编译运行,资源匮乏,那么交叉编译就诞生了。
2、树莓派是不是就不需要交叉编译?
错。也要。
树莓派有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。操作系统也是代码,也要编译!
平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心
宿主机(host) :编辑和编译程序的平台,一般是基于X86的PC机,通常也被称为主机。(pc)
目标机(target):用户开发的系统,通常都是非X86平台。host编译得到的可执行代码在target上运行。(全志、树莓派,等等)
交叉编译是需要工具的,如51单片机需要keil软件编写一样,注意工具的意义是将宿主机的代码编译成可以运行在目标及代码的工具。
软件下载连接
找到gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz就是我们需要的交叉编译工具
下好,搞到自己的虚拟机上。
我用共享内存直接cp到工作目录的
tar -xvf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
-x 解压
-v 显示进度
-f 选择文件
进入目录
cd gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/
cd bin
标红的文件aarch64-none-linux-gnu-gcc就是全志交叉的交叉编译工具。
接下来
pwd获得路径
echo $PATH 获得当前环境变量的值
PATH 环境变量
export PATH=$PATH$:{你pwm出来的路径}
修改工作目录下的.bashrc 隐藏文件,配置命令终端的
vi /home/shunge/.bashrc
在文件最后一行加入:
export PATH=$PATH$:{你pwm出来的路径}
加载配置文件,马上生效配置。
source /home/shunge/.bashrc
查看版本
aarch64-none-linux-gnu-gcc -v
aarch64-none-linux-gnu-gcc demo1.c
发现在本机上编译好出现了.a.out文件运行提示错误,因为此时文件已经成兼容orangepi的文件了,无法在pc端运行
cp demo1.c demo2.c
分别用俩个gcc进行编译,一个是系统gcc,一个是刚刚下好的。
接着如下操作:
aarch64-none-linux-gnu-gcc demo1.c -o quanzhi
gcc demo2.c -o pc
用file命令查看,普通文件与他的区别
一个是x86-64的文件,一个是ARM文件,接下来将,quanzhi文件拷入orangepi-zero2开发板进行测试
获得orangepi-zero2绝对路径,准备放到test文件夹
将这段代码放到orangepi-zero2上去运行
scp quanzhi orangepi@192.168.10.25:/home/orangepi/test
指令 文件名 开发板用户名@开发板地址:开发板的绝对路径
传送成功!
如遇问题欢迎提出共同进步!