背景:vscode编译C++程序时,导入第三方库要在c_cpp_properties.json和tasks.json中分别指定路径。感觉不如使用CMakeLists.txt。
1. 安装
仅仅安装VSCode的CMake和CMake Tools扩展是不够的,还需要在系统中安装CMake自身。这些VSCode扩展只提供了语言支持和项目管理的功能,并不包含CMake可执行文件。在 Ubuntu 上安装CMake:
# 安装在默认目录下即可 "/usr/bin/cmake"
sudo apt update
sudo apt install cmake
2. CMakeLists编写
一个简单的示例:
...
set(TensorRT_DIR /path/to/TensorRT)
include_directories(${TensorRT_DIR}/include)
link_directories(${TensorRT_DIR}/lib)
add_executable(onnx2trt main.cpp)
# 链接TensorRT库
target_link_libraries(onnx2trt
nvinfer
nvonnxparser
...)
如果是TensorRT,还需添加其他依赖库:CUDA,CUDNN。
- 为什么不用find_package()?
set(TensorRT_DIR /path/to/TensorRT)
# 给文件名/路径名或其他字符串起别名,用${变量}获取变量内容
# set(变量 文件名/路径/...)
find_package(TensorRT REQUIRED)
# 这个命令用于查找 TensorRT 库是否已经安装在系统中,并且获取它的路径和属性。如果找不到 TensorRT库
# 那么构建过程将会失败,除非指定了 QUIET 选项。这个命令还可以指定要查找的库的版本、组件、模式等。
include_directories(${TensorRT_INCLUDE_DIRS})
# 这个命令用于添加 TensorRT 的头文件目录到编译器的搜索路径中,这样就可以在代码中使用
# #include <NvInfer.h> 等语句来引用 TensorRT 的头文件。${TensorRT_INCLUDE_DIRS} 是一个变量,
# 它由 find_package(TensorRT REQUIRED) 命令设置,表示 TensorRT 的头文件目录列表。
target_link_libraries(onnx2trt ${TensorRT_LIBRARIES})
# 这个命令用于指定要链接的库列表。这个命令会将 onnx2trt 目标与 TensorRT 库进行链接,
# 这样就可以在代码中使用它们提供的函数和变量。${TensorRT_LIBRARIES} 是个变量,
# 它们由 find_package(TensorRT REQUIRED) 命令设置,表示 TensorRT 库的名称列表。
如果安装目录下没有提供CMake 包配置文件,那它是找不到的,所以不如通过 find_library 和 include_directories 指定 TensorRT 的库和头文件路径,不使用包配置的方式。CUDA与CUDNN也如此。
完整版本:
# Specify the minimum version of CMake required
cmake_minimum_required(VERSION 3.10)
# Specify the project name and version
project(onnx2trt VERSION 1.0)
set(TensorRT_DIR /home/hang/Downloads/TensorRT-8.5.1.7)
set(CUDA118_DIR /usr/local/cuda-11.8)
set(CUDNN_DIR /home/hang/Downloads/cudnn-linux-x86_64-8.6.0.163_cuda11-archive)
# Find the TensorRT library and include directories
# find_package(TensorRT REQUIRED)
include_directories(
${TensorRT_DIR}/include
${CUDA118_DIR}/include
${CUDNN_DIR}/include
)
link_directories(
${TensorRT_DIR}/lib
${CUDA118_DIR}/lib64
${CUDNN_DIR}/lib64
)
# find_package(CUDA-11.8 REQUIRED)
# Find the ONNX Parser library and include directories
# find_package(nvonnxparser REQUIRED)
# include_directories(${nvonnxparser_INCLUDE_DIRS})
# Specify the executable name and source files
add_executable(onnx2trt TRT2.cpp)
add_executable(onnx2trt2 TRT3.cpp)
add_compile_options(-g -O0)
# Link the executable with the TensorRT and ONNX Parser libraries
# target_link_libraries(onnx2trt ${TensorRT_LIBRARIES})
# 链接TensorRT库
target_link_libraries(onnx2trt
cudart
cudnn
nvinfer
nvonnxparser
)
target_link_libraries(onnx2trt2
cudart
cudnn
nvinfer
nvonnxparser
)
3. 执行
这个 CMakeLists.txt 文件会创建一个名为 onnx2trt 的可执行文件,它会使用 TRT2.cpp 中的代码来使用 ONNX Parser 将 ONNX 模型转换为 TensorRT 引擎。需要将 .cpp 文件放在与 CMakeLists.txt 文件相同的目录下。执行下面命令:
mkdir build # 创建一个 build 目录
cd build # 进入 build 目录
cmake .. # 生成 Makefile 或其他项目文件
make # 编译并链接代码
./onnx2trt # 运行可执行文件
4. 常用命令
# 本CMakeLists.txt的project名称
# 会自动创建两个变量,PROJECT_SOURCE_DIR和PROJECT_NAME
# ${PROJECT_SOURCE_DIR}:本CMakeLists.txt所在的文件夹路径
# ${PROJECT_NAME}:本CMakeLists.txt的project名称
project(xxx)
# 获取路径下所有的.cpp/.c/.cc文件,并赋值给变量中
aux_source_directory(路径 变量)
# 给文件名/路径名或其他字符串起别名,用${变量}获取变量内容
set(变量 文件名/路径/...)
# 添加编译选项
add_definitions(编译选项)
# 打印消息
message(消息)
# 编译子文件夹的CMakeLists.txt
add_subdirectory(子文件夹名称)
# 将.cpp/.c/.cc文件生成.a静态库
# 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可
add_library(库文件名称 STATIC 文件)
# 将.cpp/.c/.cc文件生成可执行文件
add_executable(可执行文件名称 文件)
# 规定.h头文件路径
include_directories(路径)
# 规定.so/.a库文件路径
link_directories(路径)
# 对add_library或add_executable生成的文件进行链接操作
# 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可
target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称)