CMake

背景: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(库文件名称/可执行文件名称 链接的库文件名称)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值