昇腾Atlas 200I DK A2 C++交叉编译和远程调试教程

  • 时间:2025-11-15 18:57 作者: 来源: 阅读:0
  • 扫一扫,手机访问
摘要:一、概述 由于昇腾Atlas 200I DK A2进行开发时存在以下问题: 编译速度慢;存储空间有限;vscode插件安装较多时启动缓慢,特别是使用GitHub Copilot经常会出现插件重启,断连等问题(现在GitHub Copilot越来越好用了,已经离不开了)。 因此考虑使用交叉编译的方式进行昇腾Atlas 200I DK A2软件开发。 二、环境说明 项目开发环境运行环境架构

一、概述

由于昇腾Atlas 200I DK A2进行开发时存在以下问题:

编译速度慢;存储空间有限;vscode插件安装较多时启动缓慢,特别是使用GitHub Copilot经常会出现插件重启,断连等问题(现在GitHub Copilot越来越好用了,已经离不开了)。
因此考虑使用交叉编译的方式进行昇腾Atlas 200I DK A2软件开发。

二、环境说明

项目开发环境运行环境
架构x86-64 工作站aarch64 Atlas 200I DK A2 开发套件
操作系统Ubuntu 24.04Ubuntu 22.04
说明用于代码开发、编译和调试的环境用于部署和实际运行的嵌入式设备环境
软件依赖vscode、build-essential、cmake、 gdb-multiarch、gcc-11-aarch64-linux-gnu g+±11-aarch64-linux-gnuCANN7.0.RC1、openssh-server、gdbserver

注: 实际代码编写可以在Windows,通过vscode的远程开发插件连接到开发环境进行开发和编译。

三、交叉编译环境搭建

1. 运行环境端

CANN安装在默认路径: /usr/local/Ascend/下,并安装官方要求配置环境变量,具体安装教程可以参考官方教程。
其他依赖软件比如opencv、ffmpeg等无论通过apt安装还是通过源码make install安装,相关的库和头文件都应该在 /usr/lib/ /usr/include/下。或者根据官方要求,第三方软件也可以安装在 /usr/local/Ascend/thirdpart/aarch64/路径下。
调试是使用gdbserver因此需要安装 openssh-server、gdbserver


sudo apt install openssh-server gdbserver

2. 开发环境端

2.1 安装依赖


sudo apt update
sudo apt instll build-essential 
    cmake 
    gdb-multiarch 
    gcc-11-aarch64-linux-gnu 
    g++-11-aarch64-linux-gnu

2.2 同步环境

创建一个路径来同步运行环境的库和头文件,比如我这里创建 /opt/ascend/sysroot


sudo mkdir -p /opt/ascend/sysroot
export SYSROOT=/opt/ascend/sysroot

同步环境,这里同步了所有的库,第一次同步会花一些时间,如果你明确需要哪些库也可以只同步指定的库,但如果不知道还是推荐同步所有的库和头文件。


rsync -a root@200DK_IP:/usr/lib/ $SYSROOT/usr/lib/
rsync -a root@200DK_IP:/usr/include/ $SYSROOT/usr/include/
rsync -a root@200DK_IP:/usr/local/Ascend/ $SYSROOT/usr/local/Ascend/

注: 1. 这里运行环境我用了root,也可以用其他用户比如HwHiAiUser等;2. 200DK_IP为运行环境的IP地址,请确保可以和开发环境ping通,并安装ssh

2.3 创建环境变量


export CPU_ARCH=aarch64
export SYSROOT=/opt/ascend/sysroot
export INSTALL_DIR=$SYSROOT/usr/local/Ascend/ascend-toolkit/latest
export THIRDPART_PATH=$SYSROOT/usr/local/Ascend/thirdpart/aarch64

四、开发实例

以官方例子,中的 YOLOV3_coco_detection_multi_thread_VENC为例。

1. 下载源码:

在开发环境端下载源码,


git clone https://gitee.com/ascend/samples.git
cd samples-master/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/YOLOV3_coco_detection_multi_thread_VEN

2. 修改CMake

在项目根目录下创建一个文件 cmake/toolchain-aarch64-ascend.cmake


# 目标系统
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

# sysroot
set(CMAKE_SYSROOT $ENV{SYSROOT})

# 交叉编译器 - 使用 GCC 11 以匹配目标系统
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc-11)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++-11)

# 基本编译与链接参数(关键:--sysroot)
set(COMMON_FLAGS "--sysroot=${CMAKE_SYSROOT} -fPIC")
set(CMAKE_C_FLAGS   "${COMMON_FLAGS}" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS "${COMMON_FLAGS}" CACHE STRING "" FORCE)

# 帮助链接器在 sysroot 内解析二/三级依赖
set(RPATH_LINKS "${CMAKE_SYSROOT}/lib/aarch64-linux-gnu:${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu")
# 如 CANN 路径不同,请据实调整
set(CANN_HOME "${CMAKE_SYSROOT}/usr/local/Ascend/ascend-toolkit/latest")
list(APPEND RPATH_LINKS "${CANN_HOME}/acllib/lib64")
# 添加 BLAS/LAPACK 库路径,以解决 armadillo/arpack/superlu 的依赖
list(APPEND RPATH_LINKS "${CMAKE_SYSROOT}/lib/aarch64-linux-gnu/blas")
list(APPEND RPATH_LINKS "${CMAKE_SYSROOT}/lib/aarch64-linux-gnu/lapack")
list(APPEND RPATH_LINKS "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/blas")
list(APPEND RPATH_LINKS "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/lapack")
list(APPEND RPATH_LINKS "${CMAKE_SYSROOT}/lib")

# 将 CMake 列表转换为冒号分隔的字符串
string(REPLACE ";" ":" RPATH_LINKS_STR "${RPATH_LINKS}")

set(CMAKE_EXE_LINKER_FLAGS
  "--sysroot=${CMAKE_SYSROOT} 
   -Wl,-rpath-link,${RPATH_LINKS_STR} 
   -Wl,-dynamic-linker,${CMAKE_SYSROOT}/lib/ld-linux-aarch64.so.1"
  CACHE STRING "" FORCE)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}" CACHE STRING "" FORCE)

# 仅在 sysroot 内查找库/头/包
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

# OpenCV(若存在 CMake 配置)
set(OpenCV_DIR ${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/cmake/opencv4 CACHE PATH "")
find_package(OpenCV REQUIRED PATHS ${OpenCV_DIR} NO_DEFAULT_PATH)

# CANN 根(按实际版本路径修正)
set(ASCEND_TOOLKIT_HOME ${CANN_HOME} CACHE PATH "")

修改 src/CMakeLists.txt,主要是能让CMake能从前面同步的 $SYSROOT中找到依赖的库和头文件。


# CMake lowest version requirement
cmake_minimum_required(VERSION 3.5.1)

# project information
project(YOLOV3_coco_detection_multi_thread_VENC)

# Compile options
add_compile_options(-std=c++11)

add_definitions(-DENABLE_DVPP_INTERFACE)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY  "out")
set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -Wall")

if (NOT DEFINED ENV{INSTALL_DIR})
    MESSAGE(FATAL_ERROR "Not Defined INSTALL_DIR")
endif()

if (NOT DEFINED ENV{THIRDPART_PATH})
    message(FATAL_ERROR "Not Defined THIRDPART_PATH")
endif()

if (NOT DEFINED ENV{CPU_ARCH})
    message(FATAL_ERROR "Not Defined CPU_ARCH")
endif()

list(APPEND COMMON_DEPEND_LIB acllite avcodec avformat avdevice avutil swresample avfilter swscale)
# Header path
include_directories(
    ../inc/
    $ENV{INSTALL_DIR}/runtime/include/
    $ENV{THIRDPART_PATH}/include/
    ${OpenCV_INCLUDE_DIRS}
)


# add host lib path
link_directories(
    $ENV{INSTALL_DIR}/runtime/lib64/stub
    $ENV{THIRDPART_PATH}/lib/
    $ENV{INSTALL_DIR}/driver
)

add_executable(main
        object_detect.cpp
        main.cpp)

target_link_libraries(main
        ascendcl 
        acl_dvpp 
        stdc++ 
        ${COMMON_DEPEND_LIB} 
        ${OpenCV_LIBS} 
        pthread)

install(TARGETS main DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

3. vscode配置文件

在根目录下创建 .vscode/settings.json .vscode/launch.json文件。
其中 .vscode/settings.json内容如下:


{
    "cmake.configureArgs": [
        "-DCMAKE_TOOLCHAIN_FILE=${workspaceFolder}/cmake/toolchain-aarch64-ascend.cmake",
    ]
}

.vscode/launch.json的内容如下:


{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Remote Debug (gdbserver)",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/src/out/main",
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb-multiarch",
            "miDebuggerServerAddress": "192.168.1.198:1234",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "logging": {
                "engineLogging": false
            },
            "linux": {
                "MIMode": "gdb"
            }
        },
    ]
}

注:1. 这里的192.168.1.198:1234是我运行端的ip地址和gdbserver启动的端口,请根据实际情况修改;2. “miDebuggerPath"一定要写成”/usr/bin/gdb-multiarch",而不是默认的gdb。

4. 编译

可以使用命令也可以使用vscode的cmake-tools插件进行编译。


mkdir build
cd build
cmake ..
cmake --build .

5. 同步编译文件给运行端

样例中编译完的可执行文件路径在 build/src/out/main相对目录下,运行端已创建运行当前项目的文件夹,假设运行文件夹为 /root/work/yolov11_cann_video,在开发端执行:


rsync -avz build/src/out/main root@192.168.1.198:/root/work/yolov11_cann_video

6. 调试程序

6.1 运行端操作

在确认编程可执行文件已传输到指定路径后,启动gdbserver:


cd /root/work/yolov11_cann_video
gdbserver :1234 main

注:1. 程序依赖的其他文件,比如模型文件,视频文件等也要放到运行环境的文件夹下,和源码中的路径要匹配;2. 模型文件如何生成请参考官方例子中的说明,om模型转换操作(从onnx、caffemodel等格式转换为om格式)需要在运行端执行。

6.2 开发端操作

因为前面已经写了 .vscode/launch.json,因此只要使用vscode的debug,默认按F5进行调试即可进入远程调试。

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】Office 2010 自带公式编辑器的公式字体怎么修改?(2025-11-15 22:07)
【系统环境|】PGC世界赛 A组队伍概览 #绝地求生(2025-11-15 22:07)
【系统环境|】讲透 Spring Boot Cloud(2025-11-15 22:06)
【系统环境|】Dubbo和SpringCloud区别详解(4大核心区别)(2025-11-15 22:06)
【系统环境|】Spring Boot3 中实现全链路追踪,你 get 了吗?(2025-11-15 22:05)
【系统环境|】SpringCloud最全详解(万字图文总结)(2025-11-15 22:05)
【系统环境|】爆了爆了,Spring Cloud面试题(2025-11-15 22:04)
【系统环境|】一文部署skywalking(2025-11-15 22:03)
【系统环境|】使用Qt实现一个简单的绘图软件(2025-11-15 22:03)
【系统环境|】用Python做科学计算(工具篇)——scikit-learn(机器学习)2(2025-11-15 22:02)
手机二维码手机访问领取大礼包
返回顶部