C++ 如何使用CMake使CUDA 8在Visual Studio 2015 update 3上工作?

C++ 如何使用CMake使CUDA 8在Visual Studio 2015 update 3上工作?,c++,visual-studio,cuda,cmake,C++,Visual Studio,Cuda,Cmake,我甚至很难为CUDA 8和Visual Studio 2015 update 3编译最简单的代码 CUDASample.cuh class CUDASample { public: CUDASample(); ~CUDASample(); }; CUDASample.cu #include "CUDASample.cuh" CUDASample::CUDASample() { } CUDASample::~CUDASample(){ } 我遇到了如下编译错误 1>C:\P

我甚至很难为CUDA 8和Visual Studio 2015 update 3编译最简单的代码

CUDASample.cuh

class CUDASample {
 public:
  CUDASample();
  ~CUDASample();
};
CUDASample.cu

#include "CUDASample.cuh"

CUDASample::CUDASample() {
}

CUDASample::~CUDASample(){
}
我遇到了如下编译错误

1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(63): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(64): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(76): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(98): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(118): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(125): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(126): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(137): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(144): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(161): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(170): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(171): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(180): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(188): error : unknown attribute "guard"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(189): error : unknown attribute "guard"
我很确定这是CUDA的问题,因为如果我将源文件扩展名改为“cpp”,将头文件扩展名改为“h”,一切都会正常工作。我怎样才能解决这个问题

编辑:

属性->链接器->命令行中显示的命令行是

/OUT:"C:\Users\David\Desktop\sample\build\bin\Release\cudasample.dll" /MANIFEST /NXCOMPAT /PDB:"C:/Users/David/Desktop/sample/build/bin/Release/cudasample.pdb" /DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "comdlg32.lib" "advapi32.lib" "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64\cudart_static.lib" /IMPLIB:"C:/Users/David/Desktop/sample/build/lib/Release/cudasample.lib" /DLL /MACHINE:X64 /INCREMENTAL:NO /PGD:"C:\Users\David\Desktop\sample\build\bin\Release\cudasample.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"cudasample.dir\Release\cudasample.dll.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /TLBID:1 
编辑:

正如Robert提到的,由于我能够成功编译cuda样本,所以问题可能与cmake配置有关。下面是我在Visual Studio 2013+CUDA 7.5上编译时使用的CmakeList

project(cudasample)

set(PROJECT_SRCS
${PROJECT_SOURCE_DIR}/src/CUDASample.cu
)

set(PROJECT_INCS
${PROJECT_SOURCE_DIR}/include/CUDASample.cuh
)

include_directories(${PROJECT_SOURCE_DIR}/include)

find_package( CUDA REQUIRED )
list(APPEND CUDA_NVCC_FLAGS "-gencode arch=compute_52,code=sm_52;")
list(APPEND CUDA_NVCC_FLAGS "-gencode arch=compute_50,code=sm_50;")
list(APPEND CUDA_NVCC_FLAGS "-gencode arch=compute_35,code=sm_35;")
list(APPEND CUDA_NVCC_FLAGS "-gencode arch=compute_30,code=sm_30;")
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
  set(CUDA_PROPAGATE_HOST_FLAGS OFF)
  list(APPEND CUDA_NVCC_FLAGS "-std=c++11;")
endif()

cuda_add_library(${PROJECT_NAME} SHARED ${PROJECT_SRCS} ${PROJECT_INCS})

有什么问题吗?

我至少设法让它工作起来了。根本原因是我头上的编译器标志CMakeLists.txt

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /sdl")
string(REGEX REPLACE "/sdl" "/sdl-" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
因此,如果我在项目CMakeLists.txt中添加这一行

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /sdl")
string(REGEX REPLACE "/sdl" "/sdl-" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
它将成功编译


但是,我仍然不清楚为什么sdl编译器标志会导致NVCC在CUDA 8和Visual Studio 2015 Update 3的组合中失败。希望有人能想出一个更好的答案

CUDA 8.0的最终发行版或候选发行版是否观察到了这一点?nvcc报告的版本号是多少?您能否在问题中添加导致这些错误消息的
nvcc
的确切调用?@njuffa这是CUDA 8的最终发行版本,
nvcc--version
产生V8.0.44。sln由cmake生成,使用标准的
find_包(需要CUDA)
CUDA_add_库
许多人不使用cmake,或者可能使用与您不同的版本。通过发布实际产生的
nvcc
命令行,您将增加其他人再现和诊断您看到的问题的机会。这几乎可以肯定是cmake、VS和CUDA组合的问题。如果您可以构建和运行CUDA示例项目,那么CUDA 8可以与VS 2015更新3正常工作。在你的问题前面提到
cmake
是一个好主意,同时在你的问题上加上
cmake
@RobertCrovella我在解决这个问题上取得了一些进展,希望得到你的意见