CMake错误:变量设置为NOTFOUND

Ja_*_*cpp 23 opencv cuda cmake ubuntu-16.04

我首先使用cuda安装cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb.现在我正在尝试安装OpenCV 3.3.0但是我得到了CMake错误:

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_nppi_LIBRARY (ADVANCED)
Run Code Online (Sandbox Code Playgroud)

然后是很长的目标列表,如下所示:

linked by target "opencv_cudev" in directory /home/jjros/opencv-3.3.0/modules/cudev
Run Code Online (Sandbox Code Playgroud)

我正在使用此命令来编译库:

cmake 

-D CMAKE_C_COMPILER=/usr/bin/gcc-5 \ 
-D CMAKE_BUILD_TYPE=RELEASE \   
-D CMAKE_INSTALL_PREFIX=/usr/local \     
-D WITH_CUDA=ON \     
-D WITH_CUBLAS=ON \     
-D WITH_TBB=ON \    
-D WITH_V4L=ON \    
-D WITH_QT=ON \     
-D WITH_OPENGL=ON \    
-D ENABLE_FAST_MATH=1 \        
-D CUDA_FAST_MATH=1 \        
-D WITH_CUBLAS=1 \        
-D INSTALL_C_EXAMPLES=OFF \    
-D INSTALL_PYTHON_EXAMPLES=ON \        
-D BUILD_SHARED_LIBS=ON \        
-D WITH_GTK=ON \        
-D BUILD_EXAMPLES=ON \     
-D  CUDA_NVCC_FLAGS="-D_FORCE_INLINES" .. 
Run Code Online (Sandbox Code Playgroud)

如何设置我的CMakeLists?出了什么问题?

api*_*i55 58

我尝试了以下工作:

FindCUDA.cmakenppi库更改为多个已拆分的库.这必须在3个地方完成.请记住,此更改只是为了使其与CUDA 9.0一起使用,我没有对版本或任何内容进行检查,如果您计划将其提供给具有不同CUDA版本的不同人员,则应该这样做.

1)寻找以下行:

find_cuda_helper_libs(nppi)
Run Code Online (Sandbox Code Playgroud)

并用线代替它:

  find_cuda_helper_libs(nppial)
  find_cuda_helper_libs(nppicc)
  find_cuda_helper_libs(nppicom)
  find_cuda_helper_libs(nppidei)
  find_cuda_helper_libs(nppif)
  find_cuda_helper_libs(nppig)
  find_cuda_helper_libs(nppim)
  find_cuda_helper_libs(nppist)
  find_cuda_helper_libs(nppisu)
  find_cuda_helper_libs(nppitc)
Run Code Online (Sandbox Code Playgroud)

2)找到行:

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}")
Run Code Online (Sandbox Code Playgroud)

并将其更改为

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppial_LIBRARY};${CUDA_nppicc_LIBRARY};${CUDA_nppicom_LIBRARY};${CUDA_nppidei_LIBRARY};${CUDA_nppif_LIBRARY};${CUDA_nppig_LIBRARY};${CUDA_nppim_LIBRARY};${CUDA_nppist_LIBRARY};${CUDA_nppisu_LIBRARY};${CUDA_nppitc_LIBRARY};${CUDA_npps_LIBRARY}")
Run Code Online (Sandbox Code Playgroud)

3)找到未设置的变量并添加新的变量因此,找到:

unset(CUDA_nppi_LIBRARY CACHE)
Run Code Online (Sandbox Code Playgroud)

并将其更改为:

unset(CUDA_nppial_LIBRARY CACHE)
unset(CUDA_nppicc_LIBRARY CACHE)
unset(CUDA_nppicom_LIBRARY CACHE)
unset(CUDA_nppidei_LIBRARY CACHE)
unset(CUDA_nppif_LIBRARY CACHE)
unset(CUDA_nppig_LIBRARY CACHE)
unset(CUDA_nppim_LIBRARY CACHE)
unset(CUDA_nppist_LIBRARY CACHE)
unset(CUDA_nppisu_LIBRARY CACHE)
unset(CUDA_nppitc_LIBRARY CACHE)
Run Code Online (Sandbox Code Playgroud)

而且OpenCVDetectCUDA.cmake你必须删除不再支持的2.0架构.

它有:

  ...
  set(__cuda_arch_ptx "")
  if(CUDA_GENERATION STREQUAL "Fermi")
    set(__cuda_arch_bin "2.0")
  elseif(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_arch_bin "3.0 3.5 3.7")
  ...
Run Code Online (Sandbox Code Playgroud)

它应该是:

  ...
  set(__cuda_arch_ptx "")
  if(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_arch_bin "3.0 3.5 3.7")
  elseif(CUDA_GENERATION STREQUAL "Maxwell")
    set(__cuda_arch_bin "5.0 5.2")
  ...
Run Code Online (Sandbox Code Playgroud)

基本上我删除了第一个if和第一个elif转向if.

正如@matko所提到 它还有:

set(__cuda_arch_bin "2.0 3.0 3.5 3.7 5.0 5.2 6.0 6.1") 
Run Code Online (Sandbox Code Playgroud)

哪个应改为:

set(__cuda_arch_bin "3.0 3.5 3.7 5.0 5.2 6.0 6.1") 
Run Code Online (Sandbox Code Playgroud)

最后一件事是需要的.CUDA 9.0现在有一个halffloat(cuda_fp16.h)的独立文件.这需要包含在OpenCV中.

从CUDA 9.0手册:

不支持的功能通用CUDA‣CUDA库.已删除内置函数__float2half_rn()和__half2float().使用CUDA工具包中更新的fp16头文件中的等效功能.

为此,您需要添加:

#include <cuda_fp16.h>
Run Code Online (Sandbox Code Playgroud)

在头文件中

opencv-3.3.0\modules\cudev\include\opencv2\cudev\common.hpp
Run Code Online (Sandbox Code Playgroud)

这是OpenCV明确补丁的基础知识.缺少什么,就像我之前告诉过你的那样,我不关心CUDA版本(它需要一个IF).此外,CUDA 9.0还有一些OpenCV使用的弃用功能......这可能会在某些时候由OpenCV团队取代.也可以不使用一个或多个nppi的分裂库.

最终建议:对于这种具有如此多选项的复杂cmakes,您应该使用ccmake(sudo apt-get install cmake-curses-gui)来轻松更改变量或至少查看值,或者使用真正的GUI.

对于Windows和Visual Studio 7的其他人,我也不得不更改CUDA_HOST_COMPILER变量,否则你会得到一堆cmd.exe exit with code 1或类似的错误......似乎它无法通过自动检测到达.

这适用于OpenCV 3.3和CUDA 9.0以及Windows 10的Visual Studio 2017.我认为它也适用于Ubuntu,因为错误和更改与CUDA有关.我没有测试过多少,我编译并运行了一些性能测试,所有这些测试都通过了......所以我认为一切正常.

  • 我正面临与gpu架构相关的错误.我正在努力解决它.它说:nvcc致命:不支持的gpu体系结构'compute_20'CMake错误在cuda_compile_generated_gpu_mat.cu.o.cmake:208(消息):生成错误/home/jjros/opencv-3.3.0/build/modules/core/CMakeFiles/cuda_compile .DIR/SRC/CUDA /./ cuda_compile_generated_gpu_mat.cu.o (4认同)
  • 答案中也有@Ja_cpp,但可能永远不会取消设置/重置变量,您可以删除构建文件夹并重新启动,也可以设置变量从cuda_arch_bin中删除2.0,因为CUDA中不再支持Fermi体系结构9.0 (2认同)