即使在CMake中WITH_CUDA = ON,OpenCV也不会使用CUDA构建

mar*_*stp 4 opencv cmake visual-studio-2013

我尝试使用CMake(gui版本)构建OpenCV 3.1来启用Cuda.我已经安装了Cuda 7.5版64位,CMake自动找到了Cuda工具包的正确路径.我确保将WITH_CUDA值设置为ON,然后按下configure.这就是我对Cuda的看法:

CUDA detected: 7.5
CUDA NVCC target flags: -gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_20,code=sm_21;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_30,code=compute_30

...

Extra dependencies:          comctl32 gdi32 ole32 setupapi ws2_32 vfw32 cudart nppc nppi npps cufft -LC:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v7.5/lib/x64

...

Other third-party libraries:
Use IPP:                     9.0.1 [9.0.1]
     at:                     C:/OpenCV-3.1.0/opencv/sources/3rdparty/ippicv/unpack/ippicv_win
Use IPP Async:               NO
Use Eigen:                   NO
Use Cuda:                    YES (ver 7.5)
Use OpenCL:                  YES
Use custom HAL:              NO

NVIDIA CUDA
Use CUFFT:                   YES
Use CUBLAS:                  NO
USE NVCUVID:                 NO
NVIDIA GPU arch:             20 21 30 35
NVIDIA PTX archs:            30
Use fast math:               YES
Run Code Online (Sandbox Code Playgroud)

然后我使用Visual Studio 12 2013 Win64生成.

接下来,我在Visual Studio 2013中打开新生成的OpenCV.sln项目并构建项目.它完成没有任何错误,但103警告像这样:

LINK : warning LNK4044: unrecognized option '/LC:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v7.5/lib/x64'; ignored
Run Code Online (Sandbox Code Playgroud)

OpenCV构建得很好,我可以用它构建程序.我也可以包含"opencv2/core/cuda.hpp",没有任何问题.但是,当我尝试使用cuda :: getDevice()时,我收到此错误:

OpenCV Error: No CUDA support (The library is compiled without CUDA support) in throw_no_cuda, file C:\builds\master_PackSlave-win64-vc12-shared\opencv\modules\core\include\opencv2/core/private.cuda.hpp, line 97
Run Code Online (Sandbox Code Playgroud)

当我从cv :: getBuildInformation()打印信息时,我得到:

Other third-party libraries:
Use IPP:                     9.0.1 [9.0.1]
     at:                     C:\builds\master_PackSlave-win64-vc12-shared\opencv\3rdparty/ippicv/unpack/ippicv_win
Use IPP Async:               NO
Use Eigen:                   NO
Use Cuda:                    NO
Use OpenCL:                  YES
Use custom HAL:              NO
Run Code Online (Sandbox Code Playgroud)

似乎Cuda在这个过程的某个地方被禁用了,但我无法弄清楚原因.我试图用相同的结果重新配置和重建几次.会喜欢这方面的帮助!

Dub*_*rzr 7

问题是CMake:它为Visual Studio生成错误的链接选项.

LINK : warning LNK4044: unrecognized option '/LC:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v7.5/lib/x64'; ignored
Run Code Online (Sandbox Code Playgroud)

它应该是"LIBPATH:C:"而不是"LC:".

解决问题:

  • 使用CMake生成解决方案
  • 转到构建目录
  • 打开一个IDE/Text编辑器,可以在此目录中进行全局搜索
  • 对于任何文件中每次出现"-LC:",请将其替换为"-LIBPATH:C:".

=========编辑=========

我发现了问题,它在CMakeLists.txt中:

foreach(p ${CUDA_LIBS_PATH})
  set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} -L${p})
endforeach()
Run Code Online (Sandbox Code Playgroud)

而不是使用"$ {CMAKE_LIBRARY_PATH_FLAG}"自动放-LIBPATH,有人把"-L"...

所以解决它:

  • 打开CMakeLists.txt
  • 将"-L"替换为"$ {CMAKE_LIBRARY_PATH_FLAG}"

使用CMake配置和生成解决方案并使用VS进行编译.

希望它会有所帮助!