即使在CMake中使用WITH_CUDA=ON,OpenCV仍无法构建CUDA。

4

我尝试使用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,但我无法弄清原因。我已经尝试重新配置和重建多次,但结果都一样。希望能得到帮助!


你使用CMake Gui吗?如果没有,试试它,它会告诉你哪些目录是必需的以及它们是否被找到/正确。 - Micka
是的,我使用GUI版本,至少在我提出的问题中与CUDA相关的一切似乎都是正确的。 - markustp
1
选项“-LC:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v7.5/lib/x64”的格式看起来像是由“gcc”或其他Linux编译器(在MinGW下,可能)使用的。您确定已安装的CUDA是否是使用“cl”编译器编译的,以便可以将其链接到VS项目中吗? - Tsyvarev
@Tsyvarev 我怎么知道它是否可以?我知道我可以在 VS 中构建和运行与 OpenCV 无关的 Cuda 项目而没有任何问题。 - markustp
好的,那么你的CUDA安装与VS兼容。那么问题就出在其他地方了。 - Tsyvarev
2个回答

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()

有些人在使用"${CMAKE_LIBRARY_PATH_FLAG}"时自动放置了-LIBPATH,而不是使用"-L"...

因此,为了解决这个问题:

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

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

希望这能帮到您!


2
的建议是,在手动编辑CMakeLists.txt后,您可以成功地使用Cuda编译OpenCV。

如果您直接从GitHub下载并编译OpenCV,则会得到相同的结果。它已经修复了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接