如何在Ubuntu 20.04上编译C++20标准的CUDA程序?
解决Ubuntu 20.04 + CUDA 12.1 + CMake 3.16下编译C++20 CUDA程序的问题
核心解决方案
针对CMake 3.16不支持CMAKE_CUDA_STANDARD 20的限制,通过手动给nvcc和宿主编译器传递C++20标准标志,同时确保宿主编译器版本兼容CUDA 12.1的要求,具体配置如下:
# 1. 指定兼容C++20的宿主编译器(以GCC 10为例,CUDA 12.1支持GCC 10-12) set(CMAKE_CXX_COMPILER /usr/bin/g++-10) set(CMAKE_C_COMPILER /usr/bin/gcc-10) # 2. 给宿主编译器设置C++20标准 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20") set(CMAKE_CXX_STANDARD_REQUIRED ON) # 3. 给nvcc同时设置设备端和宿主端的C++20标准 # --std=c++20 用于CUDA设备代码 # -Xcompiler -std=c++20 传递给宿主编译器,确保nvcc识别到宿主支持C++20 set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --std=c++20 -Xcompiler -std=c++20")
针对你之前尝试失败的原因说明
仅设置
CMAKE_CXX_STANDARD 20无效:
CMake 3.16对CUDA的集成不完善,不会自动将宿主端的C标准传递给nvcc的设备代码编译流程,导致设备端仍使用旧标准,甚至无法识别C17特性。直接添加
--std c++20到CMAKE_CUDA_FLAGS报错:
Ubuntu 20.04默认的GCC 9对C20的支持有限,CUDA 12.1会判定宿主编译器不支持C20从而忽略该标志。即使切换到GCC 10/Clang 11,也需要同时给宿主编译器显式传递-std=c++20,否则nvcc仍会认为宿主环境不兼容。CMAKE_CUDA_STANDARD 20报错:
CMake 3.18才开始支持将CUDA_STANDARD设置为20,Ubuntu 20.04默认的CMake 3.16不具备该特性,因此会提示无效值。
额外验证步骤
可以在CMakeLists.txt中添加以下代码,确认最终的编译标志是否生效:
message(STATUS "Final CUDA flags: ${CMAKE_CUDA_FLAGS}") message(STATUS "Final CXX flags: ${CMAKE_CXX_FLAGS}")
前置准备
如果容器中未安装GCC 10,执行以下命令安装:
apt update && apt install -y gcc-10 g++-10
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

