在进行CUDA和C++混合编程时,经常会遇到编写CMakelists的情况,总结一个小编写样例,供参考。
cmake_minimum_required(VERSION 3.28) # CMake最低版本号
set(CMAKE_CUDA_COMPILER "/usr/local/cuda/bin/nvcc") # 显式的指定cuda编译器
set(CMAKE_CUDA_ARCHITECTURES OFF) # 让CMake和nvcc自动检测当前可用的GPU架构
project(SemiGlobalMatchingGPU LANGUAGES CUDA CXX) # 指明编程语言为CXX和CUDA
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # 生成一个名为compile_commands.json
# 的文件,这个文件将编译命令作为JSON对象输出。这个设置通常用于与Visual Studio等集成开发环境(IDE)
# 一起使用,以便于管理和调试编译过程中的各种选项和参数。
set(CMAKE_CXX_STANDARD 17) # 用于指定C++标准的版本
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 如果没有找到指定版本的C++编译器,将发出错误
set(CMAKE_CUDA_STANDARD 17) # 用于指定CUDA编译器使用的C++版本
set(CMAKE_CUDA_STANDARD_REQUIRED ON) # 如果没有找到指定版本的编译器,发出错误
if (CMAKE_CUDA_COMPILER)
enable_language(CUDA) # 告诉系统要使用CUDA语言,绝不可以省略
message(STATUS "CUDA support enabled.")
if (POLICY CMP0146) # 忽略CMP0146警告
cmake_policy(SET CMP0146 OLD)
endif ()
include(FindCUDA)
set(CUDA_ARCH_LIST Auto CACHE STRING "List of CUDA architectures (e.g. Pascal, Volta, etc)\
or compute capability version (6.1, 7.0, etc) to generate code for. Set to Auto for \
automatic detection (default).")
cuda_select_nvcc_arch_flags(CUDA_ARC_FLAGS ${CUDA_ARC_LIST})
list(APPEND CUDA_NVCC_FLAGS ${CUDA_ARCH_FLAGS})
else ()
message(WARNING "CUDA Support disable.")
endif ()
find_package(OpenCV 3.3.1 REQUIRED) # 引入OpenCV并指定版本为3.3.1
include_directories(include) # 添加头文件搜索路径
file(GLOB_RECURSE SRC ./src/*.cpp ./src/*.cu) # 寻找./src下面所有.cpp和.cu为后缀的
# 源文件,并保存到SRC变量中
add_executable(${PROJECT_NAME} main.cpp ${SRC}) # 编译SRC变量存储的源文件,编译生成目标文件名为项目名称
#target_link_libraries(${PROJECT_NAME} XXXXXX) # 链接目标库