1.cmake 3.10
2.cuda9.0
3.opencv3.4
4.visual studio 2015,visual studio 2017
11>------ 已启动生成: 项目: opencv_core, 配置: Debug x64 ------
11>Building NVCC (Device) object modules/core/CMakeFiles/cuda_compile.dir/src/cuda/Debug/cuda_compile_generated_gpu_mat.cu.obj
11>CMake Error at cuda_compile_generated_gpu_mat.cu.obj.cmake:206 (message):
11> Error generating
11> D:/Libraries/OpenCV/opencv-3.4.0/build/test/modules/core/CMakeFiles/cuda_compile.dir/src/cuda/Debug/cuda_compile_generated_gpu_mat.cu.obj
11>
11>
11>C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(171,5): error MSB6006: “cmd.exe”已退出,代码为 1。
11>已完成生成项目“opencv_core.vcxproj”的操作 - 失败。
与此同时,VS提示:
MSB6006 “cmd.exe”已退出,代码为 1。
其中我们注意到,问题似乎出现在cuda_compile_generated_gpu_mat.cu.obj.cmake的第206行,如果找到这个文件并打开,你会发现206行附近正是在执行nvcc 指令,看起来好像是nvcc指令有问题,如果继续按照这条线索查下去,很快就会陷入歧途,因为的确有很多情况下nvcc的命令有问题,例如缺少一个空格或者用错了符号之类的,但是这条指令通常长达上万个字符,人眼根本难以检查.
实际上如果我们仔细观察,就会发现这个报错的cmake文件是由FindCuda.cmake文件所生成的,在大多数与CUDA相关的Cmake工程中,通常都会存在这个文件,其中内容根据CUDA的版本稍有不同,但是大体上是差不多的,通过对比不同的项目中的FindCUDA.cmake,笔者得出结论:这个文件本身并不存在问题,nvcc 的参数也并没有问题.问题的核心出在
$(VCInstall)
这个宏上边,熟悉VS的读者应该知道在VS的各种路径配置中我们经常会使用类似的宏,以确保在不同的系统上我们的脚本都能正确的找到工作路径而不必因为更换开发机环境而重新配置路径.这个宏明显显示的就是VC的安装位置,VC指的是VS中的”MSVC生成工具”,也就是真正执行编译,链接这些操作的”编译器内核”,这个路径对于编译工作来讲至关重要,而在VS2015和VS2017上,这个宏变量给出的路径是错的.最要命的是,如果您的电脑只安装了VS2017,不管您选装的是V141工具集还是V140工具集,这个宏给出的路径都是根本不存在的.而nvcc在工作的时候需要找到本地的C编译器,这个路径由变量”CUDA_HOST_COMPILER”给出,这个变量的默认取值,正是:
$(VCInstall)bin
所以,如果在涉及到cuda的编译时,不手动指定C编译器的正确位置,nvcc是没办法自己找到正确的位置的,因为这个宏定义的值根本不正确.
当我们遇到了nvcc的问题,并通过分析确定是由于上述问题导致的,那么我们应该设置哪个编译器给CUDA_HOST_COMPILER呢?为了找到正确的编译器,笔者安装了多个版本的VS逐个测试,如果您对VS稍有了解,应该知道他内置的生成工具中含有对应很多平台的编译器:cl.exe,最终,笔者确定:
CUDA 9.0 在VS2015内置的编译器下工作正常,如果您把VS2015安装在C盘,那么正确的cl.exe如下:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\cl.exe
另外,虽然CUDA9.0声称支持VS2017,但是笔者尝试了其中带有的所有cl工具,都不能解决这个问题.其次在nvcc编译.cu文件的过程中输出的信息全部都是”锟斤拷”之类的乱码希望有哪位了解其中奥秘的朋友能留言告诉我,谢谢~
联系我:
QQ:1535432383
邮箱:[email protected]
我的Github