使用CMake触发NVCC的C++11支持

12

我正在运行Ubuntu 15.10,使用CUDA 7.5。CMake版本为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")

这似乎是一个修补方法。根据此任务的描述,最近对此进行了工作,但我尚未找到结果。

如何让CMake在将项目声明为C++11时自动设置C++11标志?

编辑:我已经使用CUDA 8.0和CMake 3.5.1返回到这个问题。

文档中得知,set(CUDA_PROPAGATE_HOST_FLAGS ON)会传播CMAKE_CXX_FLAGS的内容,因此以下代码会为cpp和nvcc触发C++11:

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)

我似乎找不到一组CMake命令,可以避免在CXX或CUDA标志中明确设置--std=c++11


尝试将CUDA_PROPAGATE_HOST_FLAGS设置为ON(尽管默认情况下应该是ON),然后使用-std = c ++ 11设置CMAKE_CXX_FLAGS。 - Hopobcn
尝试将CUDA_PROPAGATE_HOST_FLAGS设置为ON,但没有起作用。命令set(TARGET foo CMAKE_CXX_STANDARD 11)已经在编译器中触发了C++11支持。似乎在此基础上添加set(CMAKE_CXX_FLAGS“-std=c ++ 11”)是多余的。 - Andreas Yankopolus
我认为这个功能取决于你的cmake版本。在我的情况下,使用cmake 3.5.0设置CMAKE_CXX_FLAGS-std=c++11并自动触发CUDA_PROPAGATE_HOST_FLAGS会使cmake添加--std c++11(到nvcc)。 - Hopobcn
我认为StackOverflow不是提交cmake模块错误报告或功能请求的地方,请尝试使用它们专用的错误跟踪器。 - Jakub Klinkovský
1
@AndreasYankopolus 同样的问题。CMake 3.10.0 和 CUDA 9.0。 - chaosink
显示剩余2条评论
1个回答

6
自 CMake 3.8 开始(自 CMake 支持 CUDA 作为一种语言),有一个新的目标属性 CUDA_STANDARD。尽管其名称相当令人困惑,但它将 -std=XXX 添加到 nvcc 编译命令中。
使用最近的 CMake 版本,正确的方法是:
cmake_minimum_required(VERSION 3.8.2)
enable_language(CUDA)
add_executable(foo ${foo_src} ${foo_cu})
set_property(TARGET foo PROPERTY CUDA_STANDARD 11)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接