CMake无法配置CUDA使用C++17标准的解决方案咨询
解决CMake 3.19下NVCC 11.2启用C++17的问题
你的问题我很熟悉——CMake 3.19.x确实还没有内置对CUDA C17标准的官方支持,哪怕你的NVCC 11.2本身已经完全支持C17特性了。下面给你两个可行的解决方案,按需选择:
方案一:手动指定NVCC编译标志(无需升级CMake)
既然CMake不知道怎么生成CUDA 17的编译参数,我们直接手动给NVCC传递--std=c++17标志就行。推荐分目标设置,避免全局影响其他可能的CUDA目标:
cmake_minimum_required(VERSION 3.19) project(RISA LANGUAGES CXX CUDA) # 主机端C++17配置(保持你的原有设置即可) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 添加你的源文件 add_executable(RISA src/main.cpp src/kernel.cu # 其他源文件... ) # 仅对CUDA编译语言添加C++17标志 target_compile_options(RISA PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:--std=c++17> ) # 如果你的代码需要用到CUDA扩展特性(比如设备端lambda表达式),可以额外添加: # target_compile_options(RISA PRIVATE # $<$<COMPILE_LANGUAGE:CUDA>:--expt-extended-lambda> # )
如果想全局生效(不推荐,除非项目只有一个CUDA目标),可以替换成全局变量设置:
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --std=c++17")
这个方案的核心是绕开CMake的标准检测,直接告诉NVCC使用C++17,而你的NVCC 11.2完全能识别这个参数。
方案二:升级CMake到3.20+(更简洁)
CMake从3.20版本开始正式支持CMAKE_CUDA_STANDARD 17,升级后你的原始配置代码就能正常工作。在Ubuntu 20.04上可以通过Kitware的官方源快速升级:
# 先卸载旧版本CMake sudo apt remove --purge cmake # 添加Kitware官方源 sudo apt update && sudo apt install -y apt-transport-https ca-certificates gnupg software-properties-common wget wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main' # 安装最新CMake sudo apt update && sudo apt install cmake
升级完成后,你的原始配置只需调整最低版本要求,就能正常识别CUDA 17标准:
cmake_minimum_required(VERSION 3.20) project(RISA LANGUAGES CXX CUDA) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CUDA_STANDARD 17)
额外注意事项
- 确认你的CUDA代码中使用的C17特性是NVCC 11.2支持的:NVCC 11.2对C17的支持已经覆盖了大部分常用特性(比如结构化绑定、
std::optional、std::variant等),如果遇到个别特性不支持,可以查NVIDIA的官方文档确认兼容性。 - 主机端的GCC 10.1.0完全支持C++17,所以主机代码的配置不需要调整。
内容的提问来源于stack exchange,提问作者Dominic
相关产品推荐
相关产品推荐

