CMake编译OpenCV时出现CUDA库未找到的错误

12

我正在使用CMAKE在Windows上编译带有CUDA支持的OpenCV 3.0.0。当我点击“configure”时,出现以下错误:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CUDA_cufft_LIBRARY (ADVANCED)
    linked by target "opencv_hal" in directory E:/dev-lib/opencv3/sources/modules/hal
    ...
CUDA_nppc_LIBRARY (ADVANCED)
    ...
CUDA_nppi_LIBRARY (ADVANCED)
    ...
CUDA_npps_LIBRARY (ADVANCED)

我在entries中勾选了"WITH_CUDA"和"WITH_CUFFT"。如果我还勾选了"WITH_CUBLAS",那么上面的输出将会增加一个错误。

但在所有这些错误消息之前,它显示了以下内容:

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

这表明CMAKE可以检测到CUDA。然而,需要的四个库找不到。

我之前已经安装了CUDA 7.5并使用Visual Studio 2012编译过它。CUDA示例程序运行得很完美。因此,我的CUDA库应该已经正确安装。

我想知道即使我必须手动设置这些值,我应该如何做?

我的规格:Windows 7 x64,Visual Studio 2012,CMAKE 3.4.0,CUDA Toolkit 7.5


2
你是针对x86还是x86_64架构进行配置的?有没有理由不使用预编译的二进制文件,而使用4年前的编译器? - Ivan Aksamentov - Drop
我不确定在CMAKE中如何选择x86或x86_64。我认为这是在使用MSVC编译整个项目的阶段。至于VS2012,我现在正在使用它,它仍然可以正常工作。@Drop - John Hany
1
不,生成的项目中只会有一个平台。如果您使用cmake-gui,则可以在第一次单击“配置”后弹出窗口中选择工具链+平台。您需要删除cmake缓存(在菜单“文件”中),或者只需删除构建文件夹即可再次选择另一个平台。 Nvidia仅为64位平台提供cufftnppi(请检查<CUDA_DIR> \ lib \<platform>文件夹)。 - Ivan Aksamentov - Drop
那么预构建的OpenCV库呢? - Ivan Aksamentov - Drop
谢谢,伙计。这是一个架构问题。我将生成器从“Visual Studio 11”更改为“Visual Studio 11 Win64”,然后“cufft”和所有其他库都可以在CMAKE中使用。我现在正在编译64位版本。顺便说一下,我自己编译它,因为预构建的OpenCV库不包括所有CUDA函数。@Drop - John Hany
@JohnHany:你介意关闭你的问题或者给出一个合适的答案并接受它吗?否则这个问题看起来就像没有被回答过一样。 - usr1234567
3个回答

24

感谢评论区的提示,我解决了这个问题。为了关闭这个问题,我要回答自己的问题。

这是一个“Win32或x64”架构的问题。由于NVIDIA仅为x64提供、、、、库,因此CMAKE无法为配置Win32 OpenCV库找到这些库。

我的解决方案是选择Visual Studio 11 Win64而不是Visual Studio 11作为CMAKE的生成器。这样,CMAKE将自动从\lib\x64而不是\lib\Win32中加载库。此外,我还需要以64位版本加载OpenCV所需的所有其他库,例如OpenGL。我还需要在x64架构中编译OpenCV。以后我写的所有代码都必须只能在x64中构建和调试。


如果没有阅读中文材料的困难,我很高兴提供链接,介绍了在VS2012上构建支持CUDA的OpenCV 3.0的完整指南。


感谢您提供的解决方案。我在使用VS 14和CUDA Toolkit v7.5时遇到了同样的问题。当我改为x64时,CMake找到了库文件。对于那些刚接触CMake GUI的人,需要为x64构建创建一个新的构建目录,然后在单击“配置”按钮时,它会给您选择64位编译器的选项。然后一切都很顺利。 - OnTheContrary
在更改架构之前,只需单击“文件|删除缓存”即可 :) - John Hany
我也有同样的问题,但是我使用的是VS 2017、Cmake 3.10和CUDA 9.0。对于我来说这个解决方案不起作用!仍然出现CUDA_nppi_LIBRARY-NOTFOUND和CUDA_nvcuvenc_LIBRARY-NOTFOUND。 - sgiraz
@sgira 我认为这是两个不同的问题。(1)我注意到这里指出nppi在CUDA 9中没有包含或者至少不是以其原始形式存在。这里有一个值得尝试的解决方案。(2)自从OpenCV 3.0以来,我一直无法使用NVCUVID功能进行编译,因为我的机器上没有NVENC SDK。在CMake中禁用WITH_NVCUVID可以避免这种不便。 - John Hany
就我个人而言,我建议您在同一驱动器上安装CUDA、Visual Studio和Cmake。当我将CUDA和Cmake安装在C盘,而将VS安装在D盘时,Cmake无法找到CUDA。 - Panicum

1
对于Linux的问题,我通过以下步骤解决:
(1) 检查lib文件夹中的.so文件,例如“cuda7-cudnn3/lib64”
(2) 创建符号链接,例如sudo ln -s libcublas.so.7.5.18 libcublas.so
在我的情况下,我在“CMakeLists.txt”和“Makefile.config”中正确放置了链接,但是没有.so文件。

0

这与版本真的有关!!! 如果您想使用Cuda编译,当您cmake opencv2413时,您会注意到makefile将尝试查找一些第三方库以支持更多功能:

CUDA_TOOLKIT_ROOT_DIR C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.0

从中,我知道我曾经安装过CUDA v9.0,但我仍然遇到了找不到opencv_dep_CUDA_nppi_LIBRARY错误,所以我在C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v9.0 \ lib \ x64中寻找它,我无法找到名为nppi.lib的文件,所以只是为了测试,我创建了一个空文件并将其命名为nppi.lib,我猜它可以工作,但实际上,这还不够,测试不能帮助编译opencv,而且我发现我有CUDA v8,令人惊讶的是,我在C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v8.0 \ lib \ x64中得到了lib nppi.lib;所以我改变了我的环境路径,

CUDA_TOOLKIT_ROOT_DIR C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v8.0 然后我重新配置了它。它正常工作了!


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