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

时间:2016-03-30 19:09:42

标签: opencv visual-studio-2013 cmake

我尝试使用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

然后我使用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

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

当我从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

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

2 个答案:

答案 0 :(得分:7)

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

LINK : warning LNK4044: unrecognized option '/LC:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v7.5/lib/x64'; ignored

应该是“LIBPATH:C:”而不是“LC:”。

解决问题:

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

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

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

foreach(p ${CUDA_LIBS_PATH})
  set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} -L${p})
endforeach()

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

所以要解决它:

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

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

希望它会有所帮助!

答案 1 :(得分:2)

如Dubrzr所说,您可以在手动编辑CMakeLists.txt后使用Cuda成功编译OpenCV。

如果直接从github下载并编译OpenCV,也会得到相同的结果。它已经修好了。