我正在使用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 task,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
。
答案 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)