我无法让Visual Studio与CUDA链接。特别是,在编译结束时,我得到一系列错误,说没有找到各种CUDA函数。例如:
1>gpuImagesClass.obj : error LNK2028: unresolved token (0A001289) "extern "C" enum cudaError __cdecl cudaMalloc(void * *,unsigned __int64)" (?cudaMalloc@@$$J0YA?AW4cudaError@@PEAPEAX_K@Z) referenced in function "public: __cdecl gpuImages::gpuImages(int,int)" (??0gpuImages@@$$FQEAA@HH@Z)
1>ChannelClass.obj : error LNK2028: unresolved token (0A001732) "extern "C" enum cudaError __cdecl cudaMalloc(void * *,unsigned __int64)" (?cudaMalloc@@$$J0YA?AW4cudaError@@PEAPEAX_K@Z) referenced in function "class cv::Point_<int> __cdecl FindContourPickupGPU(struct CUstream_st * *,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > >)" (?FindContourPickupGPU@@$$FYA?AV?$Point_@H@cv@@PEAPEAUCUstream_st@@V?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@@Z)
1>gpuImagesClass.obj : error LNK2020: unresolved token (0A0012C2) "extern "C" char const * __cdecl cudaGetErrorString(enum cudaError)" (?cudaGetErrorString@@$$J0YAPEBDW4cudaError@@@Z)
1>ChannelClass.obj : error LNK2028: unresolved token (0A00176D) "extern "C" char const * __cdecl cudaGetErrorString(enum cudaError)" (?cudaGetErrorString@@$$J0YAPEBDW4cudaError@@@Z) referenced in function "void __cdecl gpuAssert(enum cudaError,char const *,int,bool)" (?gpuAssert@@$$FYAXW4cudaError@@PEBDH_N@Z)
1>ChannelClass.obj : error LNK2028: unresolved token (0A001799) "extern "C" enum cudaError __cdecl cudaFree(void *)" (?cudaFree@@$$J0YA?AW4cudaError@@PEAX@Z) referenced in function "class cv::Point_<int> __cdecl FindContourPickupGPU(struct CUstream_st * *,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > >)" (?FindContourPickupGPU@@$$FYA?AV?$Point_@H@cv@@PEAPEAUCUstream_st@@V?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@@Z)
1>ChannelClass.obj : error LNK2028: unresolved token (0A00193F) "extern "C" enum cudaError __cdecl cudaMemcpy(void *,void const *,unsigned __int64,enum cudaMemcpyKind)" (?cudaMemcpy@@$$J0YA?AW4cudaError@@PEAXPEBX_KW4cudaMemcpyKind@@@Z) referenced in function "class cv::Point_<int> __cdecl FindContourPickupGPU(struct CUstream_st * *,class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > >)" (?FindContourPickupGPU@@$$FYA?AV?$Point_@H@cv@@PEAPEAUCUstream_st@@V?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@@Z)
1>gpuImagesClass.obj : error LNK2028: unresolved token (0A001388) "extern "C" enum cudaError __cdecl cudaMemGetInfo(unsigned __int64 *,unsigned __int64 *)" (?cudaMemGetInfo@@$$J0YA?AW4cudaError@@PEA_K0@Z) referenced in function "public: __cdecl gpuImages::gpuImages(int,int)" (??0gpuImages@@$$FQEAA@HH@Z)
我希望能找到可能出错的帮助。
我在Win10 64bit机器上使用VS2015和OpenCV 3.2,CUDA 8.0。
我下载了OpenCV 3.2并使用CMake 3.8.1构建了代码。
这似乎工作正常。
我在项目的构建自定义项中选择了CUDA 8.0,CUDA出现在项目属性中。
在Configuration Properties-&gt; Debugging-&gt; Environment下,PATH包含对以下内容的引用:“C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v8.0 \ bin”
在Configuration Properties-&gt; VC ++ Directories-&gt; Include Directories下,我将路径放到每个OpenCV模块的include文件中。
在Configuration Properties-&gt; VC ++ Directories-&gt; Library Directories下,我将路径放到每个OpenCV模块lib文件所在的目录中。
在配置属性 - &gt; CUDA C / C ++ - &gt; Common-&gt; CUDA Runtime下,它说“静态CUDA运行时库”
CUDA Linker选项都设置为默认值。
所以,我不确定需要设置的是什么,或者是否需要将一些CUDA相关文件移动到目录中。
编辑:我将cudart.lib添加到配置属性 - >链接器 - >输入 - >附加依赖关系,并在编译时解决了链接问题。
但是,只要您尝试在调试模式下运行应用程序,它就会崩溃:
Exception thrown at 0x00007FFC832F7A7A (ntdll.dll) in SV15.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
If there is a handler for this exception, the program may be safely continued.
在您获得任何实际代码之前会出现此错误,因此我认为它必须是各种库中的不兼容性。