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

标签 opencv visual-studio-2013 cmake

我尝试使用 CMake(gui 版本)构建 OpenCV 3.1 以启用 Cuda。我已经安装了 Cuda 7.5 64 位版本,CMake 自动找到了 Cuda 工具包的正确路径。我确保 WITH_CUDA 值设置为 ON,然后按下配置。这是我得到的有关 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 在此过程中的某处被禁用,但我不明白为什么。我曾多次尝试重新配置和重建,结果相同。希望在这方面得到一些帮助!

最佳答案

问题出在 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 编译。

希望对您有所帮助!

关于即使 WITH_CUDA=ON 在 CMake 中,OpenCV 也不会使用 CUDA 构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36317625/

相关文章:

visual-studio - Visual Studio 智能感知图标含义

c++ - 将 FetchContent_Declare 与 CMAKE_ARGS 一起使用

python - 如何保存临时图像,然后使用opencv显示它

opencv - cv2.face' 没有属性 'LBPHFaceRecognizer

c++ - OpenCV 最后的凸性缺陷不对

opencv - OpenCV 2.3.1的libtiff版本

c# - 从 Visual Studio 解决方案中将项目提取为单独的项目

c++ - 如何截取第二屏幕监视器的屏幕截图?

c++ - 链接 GMP 库时出错

cmake - CLion:启用编译器错误/警告