昇腾 - AscendCL C++应用开发 CMakeList.txt的解释

昇腾 - AscendCL C++应用开发 CMakeList.txt的解释

flyfish

举例子

cmake_minimum_required(VERSION 3.5.1)

project(sampleUsbCamera)

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")

set(INC_PATH $ENV{DDK_PATH})
if (NOT DEFINED ENV{DDK_PATH})
    set(INC_PATH "/usr/local/Ascend/ascend-toolkit/latest")
    message(STATUS "set default INC_PATH: ${INC_PATH}")
else()
    message(STATUS "set INC_PATH: ${INC_PATH}")
endif ()

set(LIB_PATH $ENV{NPU_HOST_LIB})
if (NOT DEFINED ENV{NPU_HOST_LIB})
    set(LIB_PATH "/usr/local/Ascend/ascend-toolkit/latest/runtime/lib64/stub")
    message(STATUS "set default LIB_PATH: ${LIB_PATH}")
else()
    message(STATUS "set LIB_PATH: ${LIB_PATH}")
endif ()

find_package(OpenCV REQUIRED)
find_path(AVCODEC_INCLUDE_DIR libavcodec/avcodec.h)
find_library(AVCODEC_LIBRARY avcodec)

include_directories(
   ${OpenCV_INCLUDE_DIRS}
   ${AVCODEC_INCLUDE_DIR}
   ${INC_PATH}/runtime/include/
   ./
)

link_directories(
    ${OpenCV_LIB_DIRS}
    ${AVCODEC_LIBRARY}
    ${LIB_PATH}
)

add_executable(main
               main.cpp)

if(target STREQUAL "Simulator_Function")
    target_link_libraries(main funcsim)
else()
    target_link_libraries(main ascendcl acl_dvpp stdc++ dl rt pthread acllite_dvpp_lite acllite_media acllite_om_execute acllite_common ${AVCODEC_LIBRARY} ${OpenCV_LIBS})
endif()

install(TARGETS main DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

解释

1 cmake_minimum_required(VERSION 3.5.1)指定了项目所需的最低CMake版本为3.5.1。

2 project(sampleUsbCamera)定义了项目的名称为 sampleUsbCamera

3 add_compile_options(-std=c++11)添加了编译选项,指定使用C++11标准来编译项目中的源代码。

4add_definitions(-DENABLE_DVPP_INTERFACE)添加了预处理器定义 ENABLE_DVPP_INTERFACE,用于在代码中条件编译相关的DVPP接口代码。

5 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../../../out")指定了生成的可执行文件的输出目录为 ../../../out

6

set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -Wall")

设置了编译器的标志:
CMAKE_CXX_FLAGS_DEBUG:用于Debug模式,启用了-fPIC(生成与位置无关的代码)、-O0(无优化)、-g(生成调试信息)、-Wall(启用所有常见的警告)。

CMAKE_CXX_FLAGS_RELEASE:用于Release模式,启用了-fPIC(生成与位置无关的代码)、-O2(较高优化级别)、-Wall(启用所有常见的警告)。

7

set(INC_PATH $ENV{DDK_PATH})
if (NOT DEFINED ENV{DDK_PATH})
    set(INC_PATH "/usr/local/Ascend/ascend-toolkit/latest")
    message(STATUS "set default INC_PATH: ${INC_PATH}")
else()
    message(STATUS "set INC_PATH: ${INC_PATH}")
endif ()

设置 INC_PATH 变量:
首先尝试从环境变量 DDK_PATH 中获取路径。如果环境变量未定义,则使用默认路径 /usr/local/Ascend/ascend-toolkit/latest。然后,输出所选的 INC_PATH

8

set(LIB_PATH $ENV{NPU_HOST_LIB})
if (NOT DEFINED ENV{NPU_HOST_LIB})
    set(LIB_PATH "/usr/local/Ascend/ascend-toolkit/latest/runtime/lib64/stub")
    message(STATUS "set default LIB_PATH: ${LIB_PATH}")
else()
    message(STATUS "set LIB_PATH: ${LIB_PATH}")
endif ()

设置 LIB_PATH 变量:
首先尝试从环境变量 NPU_HOST_LIB 中获取路径。如果环境变量未定义,则使用默认路径 /usr/local/Ascend/ascend-toolkit/latest/runtime/lib64/stub。然后,输出所选的 LIB_PATH

9 find_package(OpenCV REQUIRED)查找并链接OpenCV库,这是一个用于计算机视觉的开源库。

10

find_path(AVCODEC_INCLUDE_DIR libavcodec/avcodec.h)
find_library(AVCODEC_LIBRARY avcodec)

查找 libavcodec 库的头文件和库文件:
find_path 查找 libavcodec/avcodec.h 的路径。
find_library 查找 avcodec 库文件。

11

include_directories(
   ${OpenCV_INCLUDE_DIRS}
   ${AVCODEC_INCLUDE_DIR}
   ${INC_PATH}/runtime/include/
   ./
)

指定要包含的头文件目录:
OpenCV_INCLUDE_DIRS:OpenCV头文件目录。
AVCODEC_INCLUDE_DIRlibavcodec 头文件目录。
${INC_PATH}/runtime/include/:包含运行时的头文件目录。
./:当前目录。

12

link_directories(
    ${OpenCV_LIB_DIRS}
    ${AVCODEC_LIBRARY}
    ${LIB_PATH}
)

指定要链接的库文件目录:
OpenCV_LIB_DIRS:OpenCV库文件目录。
AVCODEC_LIBRARYlibavcodec 库文件目录。
LIB_PATH:其他库文件目录。

13 add_executable(main main.cpp)定义可执行文件 main,并指定源文件 main.cpp

14

if(target STREQUAL "Simulator_Function")
    target_link_libraries(main funcsim)
else()
    target_link_libraries(main ascendcl acl_dvpp stdc++ dl rt pthread acllite_dvpp_lite acllite_media acllite_om_execute acllite_common ${AVCODEC_LIBRARY} ${OpenCV_LIBS})
endif()

链接库文件到 main 可执行文件:
如果目标平台是 Simulator_Function,则链接 funcsim 库。
否则,链接 ascendclacl_dvpp 等多个库,以及 AVCODEC_LIBRARYOpenCV_LIBS

15 install(TARGETS main DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})安装生成的 main 可执行文件到指定的输出目录 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}

预处理器定义

CMake中的预处理器定义(如add_definitions(-DENABLE_DVPP_INTERFACE))用于在编译时向编译器传递预处理器宏。它们类似于C/C++中的 #define,可以在代码中根据这些宏的定义与否来决定编译路径。它们可以用来控制代码的编译行为,例如启用或禁用特定的功能。

多个CMakeList.txt文件

如果用MindStudio生成例子的时候,会产生多个CMakeList.txt文件
include(set_env.cmake) 位于 CMakeLists.txt 的开头部分,那么 set_env.cmake 中的设置就会首先被执行,以确保后续配置过程中的环境和变量都已经准备好。

# CMakeLists.txt

# 引入 set_env.cmake
include(set_env.cmake)

# 后续的项目配置
project(MyProject)

# 其他配置...

在一个包含多个 CMakeLists.txt 文件的CMake项目中,文件的执行顺序主要取决于项目的目录结构和主 CMakeLists.txt 文件的内容。

根目录的 CMakeLists.txt 文件总是首先执行。
子目录中的 CMakeLists.txt 文件执行顺序由根目录或上级目录中的 add_subdirectory() 命令的顺序决定。
如果 CMakeLists.txt 文件之间有依赖关系,那么在根目录的 CMakeLists.txt 文件中必须合理组织 add_subdirectory() 的顺序,以确保依赖顺序正确。

例子

假设有如下目录结构:

project_root/
├── CMakeLists.txt
├── subdir1/
│   ├── CMakeLists.txt
│   └── subdir1_1/
│       └── CMakeLists.txt
└── subdir2/
    └── CMakeLists.txt

project_root/CMakeLists.txt 将是第一个执行的。
如果 project_root/CMakeLists.txt 中包含以下内容:

add_subdirectory(subdir1)
add_subdirectory(subdir2)

则执行顺序为:

  1. project_root/CMakeLists.txt

  2. subdir1/CMakeLists.txt

  3. subdir1/subdir1_1/CMakeLists.txt

  4. subdir2/CMakeLists.txt

扩展

find_package(OpenCV REQUIRED)
find_path(AVCODEC_INCLUDE_DIR libavcodec/avcodec.h)
find_library(AVCODEC_LIBRARY avcodec

上面如果输出查找的情况,看如下脚本

cmake_minimum_required(VERSION 3.10)

project(MyProject)

# 查找OpenCV库
find_package(OpenCV REQUIRED)

# 输出OpenCV查找结果
if (OpenCV_FOUND)
  message(STATUS "OpenCV found: ${OpenCV_DIR}")
else()
  message(FATAL_ERROR "OpenCV not found")
endif()

# 查找AVCODEC头文件路径
find_path(AVCODEC_INCLUDE_DIR libavcodec/avcodec.h)

# 输出AVCODEC头文件查找结果
if (AVCODEC_INCLUDE_DIR)
  message(STATUS "AVCODEC include directory found: ${AVCODEC_INCLUDE_DIR}")
else()
  message(WARNING "AVCODEC include directory not found")
endif()

# 查找AVCODEC库
find_library(AVCODEC_LIBRARY avcodec)

# 输出AVCODEC库查找结果
if (AVCODEC_LIBRARY)
  message(STATUS "AVCODEC library found: ${AVCODEC_LIBRARY}")
else()
  message(WARNING "AVCODEC library not found")
endif()

上面 CMakeLists.txt 编译的过程

  1. 配置阶段 :CMakeLists.txt 文件首先配置编译器选项、链接库路径、头文件路径等。

  2. 查找依赖项 :使用 find_packagefind_pathfind_library 等命令查找并配置项目所需的依赖库(如 OpenCV 和 libavcodec)。

  3. 设置编译选项 :通过 setadd_compile_options 配置不同模式(Debug/Release)的编译标志。

  4. 生成可执行文件 :使用 add_executable 定义项目的可执行文件,并指定源代码文件。

  5. 链接库文件 :根据目标平台(如 Simulator_Function)使用 target_link_libraries 将必要的库文件链接到生成的可执行文件中。

  6. 安装目标文件 :将生成的可执行文件安装到指定的输出目录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二分掌柜的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值