You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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")

针对你之前尝试失败的原因说明

  1. 仅设置CMAKE_CXX_STANDARD 20无效:
    CMake 3.16对CUDA的集成不完善,不会自动将宿主端的C标准传递给nvcc的设备代码编译流程,导致设备端仍使用旧标准,甚至无法识别C17特性。

  2. 直接添加--std c++20到CMAKE_CUDA_FLAGS报错:
    Ubuntu 20.04默认的GCC 9对C20的支持有限,CUDA 12.1会判定宿主编译器不支持C20从而忽略该标志。即使切换到GCC 10/Clang 11,也需要同时给宿主编译器显式传递-std=c++20,否则nvcc仍会认为宿主环境不兼容。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:35:22