【发布时间】:2020-10-22 17:31:13
【问题描述】:
我正在运行带有 CUDA 7.5 的 Ubuntu 15.10。 CMmake 是 v3.2.2,NVCC 是 release 7.5,v7.5.17; GCC 是 Ubuntu 5.2.1-22ubuntu2 v5.2.1
在常规项目中触发 C++11 很容易:
project(foo CXX)
set(TARGET foo CMAKE_CXX_STANDARD 11)
我正在定义我的 CUDA 项目:
find_package(CUDA REQUIRED)
CUDA_ADD_EXECUTABLE(foo ${foo_src} ${foo_hdr} ${foo_cu})
但 C++11 支持不会传播到 NVCC。我必须补充:
list(APPEND CUDA_NVCC_FLAGS "-std=c++11")
这似乎是一个杂牌。根据this task,最近显然有这方面的工作,但我一直无法找到结果。
如何让 CMake 在将项目声明为 C++11 时自动设置 C++11 标志?
编辑:我已经用 CUDA 8.0 和 CMake 3.5.1 重新回答了这个问题。
从documentation,set(CUDA_PROPAGATE_HOST_FLAGS ON) 将传播CMAKE_CXX_FLAGS 的内容,因此以下会触发 C++11 的 cpp 和 nvcc:
set (CMAKE_CXX_FLAGS "--std=c++11")
set (CUDA_PROPAGATE_HOST_FLAGS ON)
但是,set(CMAKE_CXX_STANDARD 11) 不会影响 CMAKE_CXX_FLAGS,因此下面给出了 C++11 设备代码的编译器错误,因为没有什么可以传播:
set (CMAKE_CXX_STANDARD 11)
set (CUDA_PROPAGATE_HOST_FLAGS ON)
我似乎找不到避免在 CXX 或 CUDA 标志中明确设置 --std=c++11 的 CMake 命令组合。
【问题讨论】:
-
尝试将 CUDA_PROPAGATE_HOST_FLAGS 设置为 ON(尽管默认情况下应该设置为 ON),然后使用 -std=c++11 设置 CMAKE_CXX_FLAGS。
-
尝试将 CUDA_PROPAGATE_HOST_FLAGS 设置为 ON。没用。命令 set(TARGET foo CMAKE_CXX_STANDARD 11) 已经在编译器中触发了 C++11 支持。在此之上添加 set(CMAKE_CXX_FLAGS "-std=c++11") 似乎是多余的。
-
我认为这个功能取决于你的 cmake 版本。在我的情况下,使用 cmake 3.5.0 设置
CMAKE_CXX_FLAGS和-std=c++11并让CUDA_PROPAGATE_HOST_FLAGS自动触发 cmake 添加--std c++11(到 nvcc)。 -
我更新到 CMake 3.5.1 并且一直在查看 FindCUDA.cmake。在将 CMAKE_CXX_STANDARD 设置为 11 后,我正在打印 CMAKE_CXX_FLAGS 的值,并且很惊讶它是空的。我认为 CMake 应该根据 CMAKE_CXX_STANDARD 的值和其他变量来填充它是不是错了?
-
@AndreasYankopolus 同样的问题。 CMake 3.10.0 和 CUDA 9.0。