opencv3.4 with cuda编译中的一个疑难问题的分析与解决

opencv3.4 with cuda编译,环境如下:

1.cmake 3.10
2.cuda9.0
3.opencv3.4
4.visual studio 2015,visual studio 2017

opencv没有官方的build指南,官方提供的预编译版本中是不支持cuda的,3.X之后新加入的许多功能都需要自己编译才能获得.另一方面目前大家常用的VS版本是VS2015和VS2017,尤其是VS2017的安装目录的结构发生了变化,经常在涉及到CUDA的编译中出现如下问题:

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
邮箱:jiafeng5513@outlook.com
我的Github

学习OpenCV(5) opencv3.4 with CUDA编译相关推荐

  1. 解决 OpenCV with CUDA 编译提示缺少 nvcuvid.h 的问题

    解决 OpenCV with CUDA 编译提示缺少 nvcuvid.h 的问题 参考文章: (1)解决 OpenCV with CUDA 编译提示缺少 nvcuvid.h 的问题 (2)https: ...

  2. 【OpenCV学习】 《OpenCV3编程入门》--毛星云 01 邂逅OpenCV(OpenCV基本概念与基本架构) ROS系统上的运用(python实现)

    对 <OpenCV3编程入门>第一章的学习笔记:理解什么是计算机视觉,什么是OpenCV,以及其中的联系等等. PS:此书为2014年出版,opencv的版本和接口也与现在有些不一致了,作 ...

  3. 胎儿式保姆级教程:Jetson Xavier NX镜像烧录、开机配置、中文配置、风扇设置、远程桌面、文件传输配置、pycharm安装环境配置,QQ,opencv(cuda编译),torch(GPU).

    一.使用的硬件:nx板子.原装充电器.有线鼠标(USB).有线键盘(USB).有线摄像头(USB).7寸触摸显示屏.20寸大显示屏(显示屏有一个就可以,大屏幕更加方便).SD卡(128G,用64g也可 ...

  4. OpenCV4.4 CUDA编译与加速全解析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|OpenCV学堂 OpenCV4.4 + CUDA概述 O ...

  5. OpenCV3的GPU模块编译

    [摘要] OpenCV3的GPU模块需要手动重新编译才可以使用.本文介绍了编译OpenCV3 + GPU模块的方法. [本文使用的操作系统.软件版本] OS:Windows10 OpenCV 3.0. ...

  6. 【学习OpenCV4】如何学习OpenCV

    OpenCV是应用非常广泛的开源视觉处理库,在图像处理.计算机视觉和自动驾驶中有着非常重要的作用. 废话不多说,我就来讲讲OpenCV的使用和学习需要怎么做吧,大家觉得有道理的可以参考一下. 我理解的 ...

  7. 【从零学习OpenCV 4】安装过程中问题解决方案

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...

  8. 【从零学习OpenCV 4】opencv_contrib扩展模块的安装

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...

  9. 【从零学习OpenCV】4Ubuntu系统中安装OpenCV 4

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...

最新文章

  1. 3、python中的字符串
  2. Oracle 触发器调用存储过程|转||待研究|
  3. Git复习(九)之理解git工作区和暂存区
  4. c语言逻辑错误调试,c语言程序,现在出现逻辑错误,哪位高手指点下啊。。。...
  5. qt 中文转十六进制_QT中16进制字符串转汉字
  6. CCF 201512-2 消除类游戏
  7. js 连mysql 延后_详解MySQL 主从同步延迟
  8. oracle高级函数api,Oracle函数-高阶篇
  9. 四川交通职业技术学院计算机二级,明天考计算机了。
  10. IDEA你可能不知道的小工具
  11. vue3使用useMouseInElement实现图片局部放大预览效果
  12. 王者荣耀是如何从C++代码变到游戏的?
  13. [Splay的应用]
  14. MaskFormer
  15. 计算机二进制补位是什么,2、二进制
  16. 博南石上海公司的那个hr,貌似叫什么harvey hou,太恶心了。。。
  17. 工欲善其事,必先利其器--vim-tips
  18. MySQL数据类型选择
  19. c语言数天数类型,GPU和CPU到底有什么区别
  20. Exams/ece241 2014 q5b_HDLbits

热门文章

  1. Praat脚本-033 | Praat脚本批量提取MFCC参数
  2. 【笔试题】2020年秋招爱奇艺校园招聘测试开发卷
  3. 2022年化工自动化控制仪表操作证考试题库及答案
  4. 用python输出一张九九乘法表_如何用python输出九九乘法表?有哪些方法?
  5. “会说话”的手!这个手套可以翻译手语,还能通过APP转换语音
  6. 计算机网络之数据链路层(3)HDLC协议
  7. 如何将真格量化回测数据展示到客户端
  8. C4D R26 渲染学习笔记 建模篇(1):参数模型
  9. 云客Drupal源码分析之主题引述
  10. 武汉建成全国首个智慧城市时空信息云平台