前提知识

我们知道,不同的芯片,指令集不同,例如一般PC的CPU都是基于X86指令集来运行程序的;而手机,移动设备的CPU或者说SOC是基于ARM架构的。

交叉编译是为了在不同指令集架构的系统上编译出另一个架构能运行的程序,例如:我在基于X86架构的PC-Ubuntu中编译基于ARM64架构的ROCK5A-Ubuntu。

需要准备

  • 交叉编译指令集——一般由开发版厂家提供,或者使用收费版本

  • FTP文件传输应用——这里使用FileZilla

一、交叉编译工具链

经过不懈努力的查找,终于找到了ROCK官网中所提供的X86-ARM64交叉编译工具链gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu

在名字中aarch64-none-linux-gnu可以看出,该工具链适用于编译ARM64-Linux环境下的Linux内核、

uboot(通过none可以看出及Linux应用程序(通过linux可以看出)

二、工具链的使用

  1. 首先解压压缩包

tar xzf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.gz
  1. 将其最里面目录下的bin目录添加到环境变量中

vim /etc/environment	#不同系统环境变量有所不同
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:
/bin:/usr/games:/usr/local/games:/snap/bin"

/*
	在其中末尾加上 
	:/home/tony/桌面/rock5-toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin
	使之成为
*/

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:
/bin:/usr/games:/usr/local/games:/snap/bin:/home/tony/桌面/rock5-toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin"

然后

source /etc/environment

使环境变量更新生效

  1. 运行交叉编译链程序,检测是否正常

aarch64-none-linux-gnu-gcc -v

若输出

gcc 版本 10.3.1 20210621 (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29)) 

则表示配置正常

三、编译并在ROCK5A上运行测试程序hello

vim hello.cc
#include <iostream>

int main()
{
        std::cout<<"hello"<<std::endl;
        return 0;
}

先用本机gcc编译运行测试

g++ hello.cc 
./a.out

若输出hello,则说明程序没有问题

再用交叉编译工具编译程序

aarch64-none-linux-gnu-g++ hello.cc

使用file指令查看程序信息

file a.out

若输出

a.out: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, with debug_info, not stripped

可以看到ARM aarch64 则说明没有问题

通过FileZilla传到开发板

运行程序

输出hello,程序正常运行

山和山不相遇,人与人要相逢