[Atlas200I A2] 交叉编译的说明
0. 写在前面
实验室有两块 Atlas 200I DK A2 开发者套件(以下简称开发板),大概长这样:

通过官方教程可以往其中烧录一个 aarch64 的 Ubuntu22.04 的镜像,并在其中实现自己想要的功能。
1. 交叉编译
参考官方教程:配置交叉编译环境 👈
比方说我有一台 x86_64 架构的 Ubuntu 服务器,我就可以在服务器上进行代码的编写,并使用交叉编译工具将程序编译好,最后就可直接上传到开发板上运行。
那具体是怎么实现的呢?我将其梳理为以下步骤:
1.1 准备资源
准备好对应的 CANN 包,这里我使用 CANN-Toolkit 的 8.0.RC2.beta1 版本,下载链接为:社区版资源下载 👈。在其中我选择下载了 Ascend-cann-toolkit_8.0.RC2_linux-x86_64.run 和 Ascend-cann-toolkit_8.0.RC2_linux-aarch64.run。其中前者需要安装在服务器上,后者需要安装在开发板上。
1.2 安装资源
在对应设备上安装相应的 CANN 包,并配置好环境变量。参考:安装CANN 👈。
在服务器上安装交叉编译工具。在开发环境执行 aarch64-linux-gnu-g++ --version 命令检查是否安装 g++ 交叉编译工具,若已经安装则可以忽略。
安装命令示例如下(以下命令仅为示例,请用户根据实际情况替换,如果使用 root 用户安装依赖,请删除命令中的 sudo):
sudo apt-get install g++-aarch64-linux-gnu
1.3 编写代码并编译
在服务器上编写相应的代码,并进行编译。这里以一个简单的 hello world 代码为例。
在服务器上恰当的位置新建一个 hello.cpp 文件,输入:
// hello.cpp
#include <iostream>
int main() {
std::cout << "Hello, Ascend ARM64!" << std::endl;
return 0;
}
并在同一目录下新建一个 build.sh 文件,输入:
#!/bin/bash
set -e
CXX=aarch64-linux-gnu-g++
STUB=${HOME}/Ascend/ascend-toolkit/latest/runtime/lib64/stub/aarch64 # 此步骤最为重要,目的是将 aarch64 架构的库文件所在路径链接起来
[ -x "$(command -v $CXX)" ] || { echo "Please install g++-aarch64-linux-gnu"; exit 1; }
$CXX hello.cpp -o hello_aarch64 -L$STUB -Wl,-rpath,$STUB
file hello_aarch64
echo "build done - hello_aarch64"
之后执行 ./build.sh 即可编译代码,并在同一目录下产生最终文件 hello_aarch64 。
1.4 运行
将编译出的结果文件移动到开发板上,并使用 ./hello_aarch64 命令运行,最终运行结果如下图所示。

2. 补充
个人觉得以上的交叉编译方法也适用于其它 Atlas 设备,应该还可以进行更多非昇腾设备的扩展。
对 $CXX hello.cpp -o hello_aarch64 -L$STUB -Wl,-rpath,$STUB 的解析:
| 片段 | 含义 |
|---|---|
$CXX |
shell 变量,前面已经设为 aarch64-linux-gnu-g++,即交叉编译器。 |
hello.cpp |
要编译的源文件。 |
-o hello_aarch64 |
指定输出的可执行文件名字。 |
-L$STUB |
把 $STUB 目录加入链接阶段的库搜索路径,告诉链接器“需要时可以去这里找 .so 或 .a 文件”。 |
-Wl,-rpath,$STUB |
通过 -Wl, 把后面的选项原样传给链接器(ld)。-rpath $STUB 会把 $STUB 写入最终可执行文件的 运行时库搜索路径。程序启动时,动态加载器会先去这里找 .so,找不到再去系统默认路径。 |

浙公网安备 33010602011771号