[Atlas200I A2] 交叉编译的说明

0. 写在前面

实验室有两块 Atlas 200I DK A2 开发者套件(以下简称开发板),大概长这样:

1756278685703

通过官方教程可以往其中烧录一个 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 命令运行,最终运行结果如下图所示。

1756280192322

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,找不到再去系统默认路径。
posted @ 2025-08-27 15:49  珞喻路小白  阅读(72)  评论(0)    收藏  举报