使用CMake在NVCC中触发C ++ 11支持

时间:2016-04-11 14:24:07

标签: c++11 cuda cmake

我正在使用CUDA 7.5运行Ubuntu 15.10。 CMmake是v3.2.2,NVCC是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")

这看起来像是一块垃圾。根据{{​​3}},最近有明显的工作,但我无法找到结果。

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

编辑:我已经使用CUDA 8.0和CMake 3.5.1重新回答了这个问题。

this taskset(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

1 个答案:

答案 0 :(得分:4)

自CMake 3.8起(因为CMake支持CUDA作为一种语言),有一个新的目标属性CUDA_STANDARD。虽然它的名字很混乱,但它将-std=XXX添加到nvcc编译命令。

使用最近的CMake版本,正确的方法是

cmake_minimum_required(3.8.2)
enable_language(CUDA)
add_executable(foo ${foo_src} ${foo_cu})
set_property(TARGET foo PROPERTY CUDA_STANDARD 11)