【问题标题】:CMake: CUDA libraries not found when compiling OpenCVCMake:编译 OpenCV 时未找到 CUDA 库
【发布时间】:2018-05-21 11:11:53
【问题描述】:

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

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)

我已经检查了条目中的“WITH_CUDA”和“WITH_CUFFT”。如果我也检查“WITH_CUBLAS”,上面的输出将增加一个CUDA_cublas_LIBRARY 错误。

但在所有这些错误消息之前,它表明

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。但是,找不到所需的这 4 个库。

我之前已经安装了 CUDA 7.5 并用 Visual Studio 2012 编译过它。 CUDA 样本运行完美。所以应该正确安装我的 CUDA 库。

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

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

【问题讨论】:

  • 您是针对 x86 还是 x86_64 架构进行配置?是否有理由不使用预编译的二进制文件并使用 4 年前的编译器?
  • 我不确定如何在 CMAKE 中选择 x86 或 x86_64。我认为它处于使用 MSVC 编译整个项目的阶段。至于VS2012,我现在在用,还是可以的。@Drop
  • 不,生成的项目中只有一个平台。如果您使用的是cmake-gui,您可以在第一次单击配置后在弹出窗口中选择工具链+平台您需要删除cmake缓存(在菜单“文件”中),或者只需删除构建傻瓜即可再次选择另一个平台。 Nvidia 仅提供 cufftnppi 用于 64 位平台(检查 <CUDA_DIR>\lib\<platform> 文件夹)。
  • 那么pre-built OpenCV libs呢?
  • 谢谢,伙计。这是一个架构问题。我将生成器从Visual Studio 11 更改为Visual Studio 11 Win64cufft,并且所有其他库都可用于CMAKE。我现在正在为 64 位编译它。仅供参考,我正在自己编译它,因为预构建的 OpenCV 库不包含所有 CUDA 函数。@Drop

标签: c++ opencv cmake


【解决方案1】:

感谢 Drop in the cmets 的提示,我解决了这个问题。为了结束这个问题,我正在回答我自己的问题。

这是一个“Win32 或 x64”架构问题。由于NVIDIA只为x64提供了cufftnvblasnppcnppinpps库,所以CMAKE自然不可能找到这些库来配置Win32 OpenCV库。

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


如果阅读中文资料没有问题,我很高兴提供link 以获取有关在支持CUDA 的VS2012 上构建OpenCV 3.0 的完整指南的帖子。

【讨论】:

  • 感谢您的解决方案。我在使用 VS 14 和 CUDA Toolkit v7.5 时遇到了同样的问题。当我更改为 x64 时,CMake 找到了这些库。只是给我们这些 CMake GUI 新手的注意事项,您需要为 x64 构建创建一个新的构建目录,然后单击“配置”按钮时,它将为您提供选择 64 位编译器的选项。然后一切对我来说进展顺利。
  • 或者在改变架构之前直接点击File | Delete Cache:)
  • 我有同样的问题,但使用的是 VS 2017、Cmake 3.10 和 CUDA 9.0。该解决方案对我不起作用!还是 CUDA_nppi_LIBRARY-NOTFOUND 和 CUDA_nvcuvenc_LIBRARY-NOTFOUND
  • @sgira 我认为它们是两个独立的问题。 (1) 我注意到here 表明nppi 不包含在CUDA 9 中,或者至少不是其原始形式。 Here 是一个值得尝试的解决方案。 (2) 自 OpenCV 3.0 以来,我一直无法使用 NVCUVID 功能进行编译,因为我的机器上没有 NVENC SDK。在 CMake 中禁用 WITH_NVCUVID 可以避免这种不便。
  • 就我而言,我可以补充一点,您应该在同一个驱动器上安装 CUDA、Visual Studio 和 Cmake。当我在驱动器 C 上安装 CUDA 和 Cmake 并在驱动器 D 上安装 VS 时,Cmake 无法找到 CUDA。
【解决方案2】:

对于Linux,我通过以下步骤解决了:

(1)查看lib文件夹下的.so文件,如cuda7-cudnn3/lib64

(2) 制作符号链接,如sudo ln -s libcublas.so.7.5.18 libcublas.so

就我而言,我在 CMakeLists.txt 和 Makefile.config 中正确放置了链接,但没有 .so 文件。

【讨论】:

    【解决方案3】:

    真的跟版本有关!!! 如果你想用cuda编译,当你cmake opencv2413时,你会注意到makefile会尝试寻找一些第三方库来支持更多的功能:

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

    据此,我知道我曾经安装过 CUDA v9.0,但我仍然得到这个 not found 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语言的lib nppi.lib :\Program Files\NVIDIA GPU 计算工具包\CUDA\v8.0\lib\x64;所以我改变了我的环境路径,

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

    【讨论】:

      猜你喜欢
      • 2013-07-17
      • 2022-01-25
      • 2016-10-07
      • 2013-02-05
      • 1970-01-01
      • 2020-01-06
      • 2015-10-31
      • 2015-07-12
      相关资源
      最近更新 更多