web-dev-qa-db-ja.com

CMakeエラー:変数がNOTFOUNDに設定されています

最初にcuda-repo-ubuntu1604-9-0-local_9.0.176-1_AMD64.debを使用してcudaをインストールしました。今、私は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)

そして、次のような非常に長いターゲットのリスト:

linked by target "opencv_cudev" in directory /home/jjros/opencv-3.3.0/modules/cudev

私はこのコマンドを使用してライブラリをコンパイルしています:

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" .. 

CMakeListを設定するにはどうすればよいですか?何が問題なのでしょうか?

23
Ja_cpp

私は次を試してみましたが、うまくいきました:

FindCUDA.cmakenppiライブラリをいくつかの分割されたライブラリに変更します。これは3か所で行う必要があります。この変更はCUDA 9.0で動作するようにするためのものであり、バージョンなどの確認は行っていません。CUDAのバージョンが異なる別のユーザーに提供する場合は、このチェックを行う必要があります。

1)次の行を探します:

find_cuda_helper_libs(nppi)

次の行に置き換えます。

  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)

2)行を見つけます:

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}")

に変更します

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}")

3)設定されていない変数を見つけて、新しい変数も追加します。

unset(CUDA_nppi_LIBRARY CACHE)

次のように変更します。

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)

また、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")
  ...

そのはず:

  ...
  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")
  ...

基本的に、最初のifを削除し、最初のElifがifに変わります。

@ matkoで述べたように以下もあります:

set(__cuda_Arch_bin "2.0 3.0 3.5 3.7 5.0 5.2 6.0 6.1") 

次のように変更する必要があります。

set(__cuda_Arch_bin "3.0 3.5 3.7 5.0 5.2 6.0 6.1") 

最後に必要なことです。 CUDA 9.0には、現在、ハーフフロート用の個別ファイル(cuda_fp16.h)があります。これはOpenCVに含まれる必要があります。

CUDA 9.0マニュアルから:

サポートされない機能一般CUDA‣CUDAライブラリ。組み込み関数__float2half_rn()および__half2float()は削除されました。 CUDAツールキットの更新されたfp16ヘッダーファイルで同等の機能を使用します。

これを行うには、次を追加する必要があります。

#include <cuda_fp16.h>

ヘッダーファイル内

opencv-3.3.0\modules\cudev\include\opencv2\cudev\common.hpp

これがOpenCVの確定パッチの基本です。前に言ったように、CUDAのバージョンは気にしません(IFが必要です)。また、CUDA 9.0にはOpenCVで使用される非推奨の関数が多数あります。これはおそらく、いつかOpenCVチームによって置き換えられるでしょう。 nppiの1つ以上の分割ライブラリが使用されていない可能性もあります。

最終的な推奨事項:非常に多くのオプションを持つこの種の複雑なcmakeについては、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で機能しました。エラーと変更はCUDAに関連しているため、Ubuntuでも機能するはずです。あまりテストしていないので、いくつかのパフォーマンステストをコンパイルして実行しましたが、すべて合格しました。

56
api55

@ api55このプロセスに基づいて完了できますが、私のプロセスで@Ja_cppの問題(cuda_compile_generated_gpu_mat.cu.o.cmake:208(メッセージ)でCMakeエラー)が発生しますが、追加する必要もあります。

OpenCVDetectCUDA.cmake

次のものがあります。

set(__cuda_Arch_bin "2.0 3.0 3.5 3.7 5.0 5.2 6.0 6.1") 

への変更:

set(__cuda_Arch_bin "3.0 3.5 3.7 5.0 5.2 6.0 6.1")

それは私のために働いた。

4
max ko

FindCUDA.cmakeおよびOpenCVDetectCUDA.cmakehttps ://github.com/opencv/opencv/tree/master/cmake (master branch- opencv 3.4.1)は、opencv_2.4.13NVIDIA TitanXPグラフィックカードPascalアーキテクチャおよびwithcuda-9.0Ubuntu 16.04で。

3

また、OpenCVDetectCUDA.cmakeで以下を実行する必要がありました。

取り替える

    if(${CUDA_VERSION} VERSION_LESS "8.0")
       set(__cuda_Arch_bin "3.0 3.5 3.7 5.0 5.2")
     else()
       set(__cuda_Arch_bin "3.0 3.5 3.7 5.0 5.2 6.0 6.1")
     endif()

    if(${CUDA_VERSION} VERSION_LESS "8.0")
      set(__cuda_Arch_bin "3.0 3.5 3.7 5.0 5.2")    
      set(CUDA_Arch_BIN "3.0 3.5 3.7 5.0 5.2")
    else()
      set(__cuda_Arch_bin "3.0 3.5 3.7 5.0 5.2 6.0 6.1")
      set(CUDA_Arch_BIN "3.0 3.5 3.7 5.0 5.2 6.0 6.1")
    endif()
2
Mudassir Khan

@ api55ソリューションは、CUDA_nppi_LIBRARYに関連するエラーを解決します。したがって、手順に従うだけで機能します(私にとってはUbuntu 16.04opencv 3.3)。 GPUアーキテクチャがサポートされていることを確認してください。 Fermiはサポートされなくなりました。解決策は、Cuda-8をcudaサポート付きでインストールするときに、gcc-5opencv 3.3コンパイラとともにインストールすることです。

0
Ja_cpp

Api555が言った方法を試してみましたが、cmakeのときにsm20もビルドするとき、私はもう2つの方法をしました:

1. OpenCVDetectCUDA.cmakeファイルの133行目の「foreach(Arch IN LISTS Arch_LIST)」ループで、ifとelseの間に「elseif(Arch MATCHES "20")」を追加します。

2. OpenCVDetectCUDA.cmakeファイルの46行目で、「set(_generations "Fermi" "kepler" "Maxwell" "Pascal")」は「Fermi」を削除します

私は2番目の方法を好みます、それは少し助けになるかもしれません。

0
Allen Chan

既存のopencvを最新バージョンに置き換えると、正常に機能します。 XD

0
Rakshith Reddy