我尝试使用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在这个过程的某个地方被禁用了,但我无法弄清楚原因。我试图用相同的结果重新配置和重建几次。会对此有所帮助!
答案 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:”。
解决问题:
=========编辑=========
我发现了问题,它出现在CMakeLists.txt中:
foreach(p ${CUDA_LIBS_PATH})
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} -L${p})
endforeach()
不是使用自动放入-LIBPATH的“$ {CMAKE_LIBRARY_PATH_FLAG}”,而是有人把“-L”......
所以要解决它:
配置&使用CMake生成解决方案并使用VS进行编译。
希望它会有所帮助!
答案 1 :(得分:2)
如Dubrzr所说,您可以在手动编辑CMakeLists.txt后使用Cuda成功编译OpenCV。
如果直接从github下载并编译OpenCV,也会得到相同的结果。它已经修好了。