免抓包资源嗅探:手把手把视频号视频存到本地,3 步上手
2026/10/8 14:10:11
在现代 CMake(3.8 及以上版本)中,处理 CUDA 的推荐方式已从传统的find_package(CUDA)转向更集成的CUDA 作为一等语言支持。以下是系统化的现代方法解析及实践指南:
FindCUDA模块。通过project()声明LANGUAGES CUDA,CMake 会自动处理编译器发现、架构检测和编译规则。find_package(CUDA):传统find_package(CUDA)主要用于查找nvcc编译器和库路径,而现代方法通过enable_language(CUDA)或项目语言声明直接激活 CUDA 支持。在CMakeLists.txt顶层设置项目语言:
cmake_minimum_required(VERSION 3.8) project(MyProject LANGUAGES CXX CUDA # 同时启用 C++ 和 CUDA )nvcc)并处理混合语言编译。为具体目标(可执行文件/库)添加 CUDA 源文件:
add_executable(my_target main.cpp kernel.cu # CMake 自动识别 CUDA 源文件 )set_source_files_properties(... PROPERTIES LANGUAGE CUDA)显式指定文件语言。set(CMAKE_CUDA_ARCHITECTURES 70 80 86) # 对应 sm_70, sm_80, sm_86或通过变量传递:target_compile_options(my_target PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:-arch=sm_80>)target_compile_options(my_target PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:-O3;-use_fast_math> $<$<COMPILE_LANGUAGE:CXX>:-O2> )find_package(CUDA)的高级场景使用find_package(CUDAToolkit)(CMake 3.17+):
find_package(CUDAToolkit REQUIRED) target_link_libraries(my_target PRIVATE CUDAToolkit::cublas)cublas,curand,nvcc,cudart等组件,替代传统${CUDA_LIBRARIES}。若需兼容旧版 CMake 或保留传统逻辑:
find_package(CUDA 11 REQUIRED) # 显式要求 CUDA 11+ include(${CUDA_USE_MODULE}) # 包含传统宏 target_compile_options(my_target PRIVATE ${CUDA_NVCC_FLAGS})通过target_compile_features和target_compile_options统一管理:
target_compile_features(my_target PUBLIC cxx_std_17 cuda_std_14) target_compile_options(my_target PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wall;-Xcompiler=-Wextra> )利用 CMake 生成配置头文件:
configure_file(config.h.in config.h) target_include_directories(my_target PRIVATE ${CMAKE_CURRENT_BINARY_DIR})在config.h.in中:
#cmakedefineUSE_CUDAfind_package和手动变量设置。target_*命令无缝协作,支持CUDA_ARCHITECTURES等新特性。CMAKE_CUDA_ARCHITECTURES)。find_package(CUDA),优先使用项目语言声明。cmake_minimum_required(VERSION 3.18) project(MyCUDAProject LANGUAGES CXX CUDA ) set(CMAKE_CUDA_ARCHITECTURES 70 80) # 指定 GPU 架构 add_executable(my_app main.cpp kernel.cu ) target_compile_features(my_app PUBLIC cxx_std_17 cuda_std_14) target_compile_options(my_app PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:-O3;-use_fast_math> ) # 链接 CUDA 库(可选,自动处理) find_package(CUDAToolkit REQUIRED) target_link_libraries(my_app PRIVATE CUDAToolkit::cublas)现代 CMake 处理 CUDA 的核心是将 CUDA 视为项目原生语言,通过project(LANGUAGES CUDA)激活支持,结合CMAKE_CUDA_ARCHITECTURES和target_*命令实现精细控制。传统find_package(CUDA)逐渐被find_package(CUDAToolkit)和语言声明替代,提升了配置的简洁性和跨平台能力。迁移旧项目时,建议逐步替换为现代语法,并确保 CMake 版本≥3.18 以利用最新特性。