C++11 在cmake中使用nvcc编译.cu

C++11 在cmake中使用nvcc编译.cu,c++11,cuda,cmake,nvcc,C++11,Cuda,Cmake,Nvcc,我有一个OpenCV C++脚本,我需要在里面使用CUADAMEMCPY。所以我在脚本中使用了cudamemcpy,并将文件保存为.cu,我使用的是cmake。因此,我添加了.cu作为cuda_可执行文件。但是当我使用“sudomake”时,我得到了以下错误 这是生成文件 所以在第27行中,我将c++0x更改为c++11,得到了相同的错误 所以我尝试了gnu++11,但仍然有相同的错误。问题是-std=c++11如果通过add_definitions()传递,则不会添加到nvcc构建命令中。

我有一个OpenCV C++脚本,我需要在里面使用CUADAMEMCPY。所以我在脚本中使用了cudamemcpy,并将文件保存为.cu,我使用的是cmake。因此,我添加了.cu作为cuda_可执行文件。但是当我使用“sudomake”时,我得到了以下错误

这是生成文件

所以在第27行中,我将c++0x更改为c++11,得到了相同的错误
所以我尝试了gnu++11,但仍然有相同的错误。

问题是
-std=c++11
如果通过
add_definitions()
传递,则不会添加到
nvcc
构建命令中。从:

通过-D或/D传递到add_定义中的标志将传递给nvcc

其他选项如
-std=c++11
不会传递给
nvcc

通过将
c++11
添加到
CUDA\u NVCC\u标志中,可以全局启用
c++11

set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -std=c++11" )
或者在每个目标级别上使用

cuda_add_executable(opencv opencv.cu OPTIONS -std=c++11)

正如Talonmes在评论中指出的那样:如果您只需要运行时API中的函数,比如
cudaMemcpy()
,那么您可以在普通的C++文件中使用它们(不需要.cu扩展名)。然后,您需要包括
cuda_runtime_api.h
并链接到cuda运行库
cudart
。(确保cuda包含目录位于包含路径上,库位于库路径中,如果使用
nvcc
进行编译,则会自动处理该目录。)


更新
< >对于CKED的最新版本设置C++标准的正确方法在这里解释如下:

< P>问题是,如果代码通过<代码> AddioDealixStices()/<代码>传递,则<代码> -STD= C++ 11 不添加到NVCC 通过-D或/D传递到add_定义中的标志将传递给nvcc

其他选项如
-std=c++11
不会传递给
nvcc

通过将
c++11
添加到
CUDA\u NVCC\u标志中,可以全局启用
c++11

set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -std=c++11" )
或者在每个目标级别上使用

cuda_add_executable(opencv opencv.cu OPTIONS -std=c++11)

正如Talonmes在评论中指出的那样:如果您只需要运行时API中的函数,比如
cudaMemcpy()
,那么您可以在普通的C++文件中使用它们(不需要.cu扩展名)。然后,您需要包括
cuda_runtime_api.h
并链接到cuda运行库
cudart
。(确保cuda包含目录位于包含路径上,库位于库路径中,如果使用
nvcc
进行编译,则会自动处理该目录。)


更新
< >对于CMAGE的最新版本设置C++标准的正确方法在这里解释:

如果您所做的是从运行时API调用函数,则不需要为源使用.Cu扩展。另外,请不要将错误文本和代码作为图像发布。搜索不适用于图像这一代工程师从来不知道拨号调制解调器。如果您所做的只是从运行时API调用函数,则不需要对源代码使用.cu扩展名。另外,请不要将错误文本和代码作为图像发布。搜索无法处理图像他们这一代工程师从来不知道拨号调制解调器。