CMake 无法设置 CUDA 标准 c++17

Posted

技术标签:

【中文标题】CMake 无法设置 CUDA 标准 c++17【英文标题】:CMake cannot set CUDA standard c++17 【发布时间】:2021-10-28 23:37:19 【问题描述】:

我正在使用 CMake 配置 CUDA/C++ 项目。使用 NVCC 编译的一些文件需要 C++ 17 特性。要启用这些,我会使用:

cmake_minimum_required(VERSION 3.19)
project(RISA LANGUAGES CXX CUDA)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CUDA_STANDARD 17)

导致错误消息:

Target "RISA" requires the language dialect "CUDA17" (with compiler extensions), but CMake does not know the compile flags to use to enable it.

仔细检查CMAKE_CUDA_COMPILE_FEATURES 变量会发现cuda_std_03 cuda_std_11 cuda_std_14。出于某种原因,CMake 似乎不知道 C++14 之后关于 CUDA 的任何内容。

我正在运行 ubuntu 20.04

NVCC 11.2 GCC 10.1.0 CMake 3.19.6

如何使用此设置配置和编译 C++17?

我知道this 的问题 - 但是仅使用 C++14 编译 cuda 文件的解决方案对我来说是不够的。

【问题讨论】:

你试过CUDA_STANDARDinstead吗? @KenY-N 刚刚做了,结果一模一样。 哦,实际上消息“CMake 不知道用于启用它的编译标志”并不意味着 CMake 不知道关于给定功能 (CUDA17)。该消息表示 CMake 了解该功能,但它不知道如何将此功能应用到您实际拥有的编译器。您是否检查过 CMake 是否准确找到了 NVCC 11.2,并且给定的编译器支持 C++17? 好吧,谁会猜到,还有另一个设置路径:CMAKE_CUDA_COMPILER 指向旧版本。现在可以了,再次感谢! @Dominic:我已经重新打开了这个,所以你现在可以添加一个答案来帮助未来的访问者遇到同样的问题 【参考方案1】:

事实证明,CMake 没有使用正确的 nvcc 二进制文件。

就我而言,我的系统上有两个版本的 nvcc:

nvcc v10.1.243/usr/binnvcc v11.2.152/usr/local/cuda-11.2/bin

在我的 CMake 配置中,

CUDA_NVCC_EXECUTABLE 设置为 /usr/local/cuda-11.2/bin,但是 CMAKE_CUDA_COMPILER/usr/bin 中设置为旧版本。

CMAKE_CUDA_COMPILER设置为正确的路径后,CMake能够检测到nvcc 11.2.152并可以应用C++17标准。

【讨论】:

以上是关于CMake 无法设置 CUDA 标准 c++17的主要内容,如果未能解决你的问题,请参考以下文章

cmake如何在C ++中将编译器标志附加到末尾

vs2017+opencv+qt+cuda,使用cmake编译opencv的库

无法在 RHEL 7 上使用 CUDA 构建 OpenCV

CMake 3.x + CUDA - 编译失败

无法解析命名空间成员“线程”

即使在构建可执行文件时,CMake 3.0 + Fortran + CUDA也需要-fPIC