it-swarm-ja.com

OpenCVがコンパイルに失敗しました "Eigen / Core:そのようなファイルまたはディレクトリはありません" -CMakeエントリを変更できません

OpenCVをインストールしようとしていますが、CMakeを使用してコンパイルしようとすると、質問に記載されているエラーが常に発生します。通常は約4%〜6%です。

[  6%] Building CXX object modules/core/CMakeFiles

/opencv_test_core_pch_dephelp.dir/opencv_test_core_pch_dephelp.cxx.o
In file included from /home/joey/opencv/opencv/opencv/modules/core/test/test_precomp.hpp:12:0,
                 from /home/joey/opencv/opencv/build/modules/core/opencv_test_core_pch_dephelp.cxx:1:
/home/joey/opencv/opencv/opencv/modules/core/include/opencv2/core/private.hpp:66:12: fatal error: Eigen/Core: No such file or directory
 #  include <Eigen/Core>
            ^~~~~~~~~~~~
compilation terminated.
modules/core/CMakeFiles/opencv_test_core_pch_dephelp.dir/build.make:62: recipe for target 'modules/core/CMakeFiles/opencv_test_core_pch_dephelp.dir/opencv_test_core_pch_dephelp.cxx.o' failed
make[2]: *** [modules/core/CMakeFiles/opencv_test_core_pch_dephelp.dir/opencv_test_core_pch_dephelp.cxx.o] Error 1
CMakeFiles/Makefile2:1229: recipe for target 'modules/core/CMakeFiles/opencv_test_core_pch_dephelp.dir/all' failed
make[1]: *** [modules/core/CMakeFiles/opencv_test_core_pch_dephelp.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

それで、グーグルをした後、CMakeがEigenに行く場所を変更する必要があると決めました。 cmake-guiを使用して、同様の質問からの回答のアドバイスを受けて、Eigen3_DIRを/ usr/lib/cmake/eigen3から/ usr/include/eigen3に変更しました(完全に類似しているわけではありません。パスの変更を推奨し、後者のパスを指定しました)。 configureを押すか、生成しようとすると問題が発生します:CMakeはエントリを元に戻します。いくつかのCMakeファイル(CMakeCache.txt、CMakeLists.txt)を調べてみましたが、実際には何を見ているのかわからないので、自分より知識のある人に聞いてみようと思いました。また、両方のパスを調べましたが、どちらの場合も、目的のファイル(eigen3/Eigen /(ヘッダーファイル)とeigen3 /(cmake構成ファイル))が存在します。

Ubuntu18.04を実行しています。 2つのディレクトリにインストールしてみました。1つは〜/ opencvに、もう1つは/ mnt/Linux/opencvにインストールしました。コンパイルを試みるたびに、ビルドファイルを削除し、OpenCVを再構築します。どちらも同じ結果をもたらしました。また、ソースを削除して再クローンを作成しようとしましたが、最初から数回、役に立たなかったのです。

どうしたの?設定が不足していますか、それとも問題に焦点を合わせていますか?どんな助けでも大いに感謝され、導かれ、または与えられます。

1
AsianInvasi0n

これはおそらくちょっとハックですが、私はそれを修正しました:

私が修正に至った理由 -OpenCVではありませんが、同じ種類の問題です。

Cmake/OpenCVFindLibsPerf.cmakeで、Eigenブロックのこの部分をコメントアウトしました。

#if(TARGET Eigen3::Eigen)
  # Use Eigen3 imported target if possible
  #list(APPEND OPENCV_LINKER_LIBS Eigen3::Eigen)
  #set(HAVE_EIGEN 1)

また、find_package呼び出しをに変更しました

find_package(Eigen3 3.0.0)

コードの完全なEigenブロック:

if(WITH_EIGEN AND NOT HAVE_EIGEN)
  find_package(Eigen3 3.0.0)
  if(Eigen3_FOUND)
    #if(TARGET Eigen3::Eigen)
      # Use Eigen3 imported target if possible
      #list(APPEND OPENCV_LINKER_LIBS Eigen3::Eigen)
      #set(HAVE_EIGEN 1)
    else()
      if(DEFINED EIGEN3_INCLUDE_DIRS)
        set(EIGEN_INCLUDE_PATH ${EIGEN3_INCLUDE_DIRS})
        set(HAVE_EIGEN 1)
      elseif(DEFINED EIGEN3_INCLUDE_DIR)
        set(EIGEN_INCLUDE_PATH ${EIGEN3_INCLUDE_DIR})
        set(HAVE_EIGEN 1)
      endif()
    #endif()
    if(HAVE_EIGEN)
      if(DEFINED EIGEN3_WORLD_VERSION)  # CMake module
        set(EIGEN_WORLD_VERSION ${EIGEN3_WORLD_VERSION})
        set(EIGEN_MAJOR_VERSION ${EIGEN3_MAJOR_VERSION})
        set(EIGEN_MINOR_VERSION ${EIGEN3_MINOR_VERSION})
      else()  # Eigen config file
        set(EIGEN_WORLD_VERSION ${EIGEN3_VERSION_MAJOR})
        set(EIGEN_MAJOR_VERSION ${EIGEN3_VERSION_MINOR})
        set(EIGEN_MINOR_VERSION ${EIGEN3_VERSION_PATCH})
      endif()

  if(NOT HAVE_EIGEN)
    if(NOT EIGEN_INCLUDE_PATH OR NOT EXISTS "${EIGEN_INCLUDE_PATH}")
      set(__find_paths "")
      set(__find_path_extra_options "")
      if(NOT CMAKE_CROSSCOMPILING)
        list(APPEND __find_paths /opt)
      endif()
      if(DEFINED ENV{EIGEN_ROOT})
        set(__find_paths "$ENV{EIGEN_ROOT}/include")
        list(APPEND __find_path_extra_options NO_DEFAULT_PATH)
      else()
        set(__find_paths ENV ProgramFiles ENV ProgramW6432)
      endif()
      find_path(EIGEN_INCLUDE_PATH "Eigen/Core"
                PATHS ${__find_paths}
                PATH_SUFFIXES include/eigen3 include/eigen2 Eigen/include/eigen3 Eigen/include/eigen2
                DOC "The path to Eigen3/Eigen2 headers"
                ${__find_path_extra_options}
      )
    endif()
    if(EIGEN_INCLUDE_PATH AND EXISTS "${EIGEN_INCLUDE_PATH}")
      ocv_parse_header("${EIGEN_INCLUDE_PATH}/Eigen/src/Core/util/Macros.h" EIGEN_VERSION_LINES EIGE$
      set(HAVE_EIGEN 1)
    endif()
  endif()
endif()
if(HAVE_EIGEN)
  if(EIGEN_INCLUDE_PATH AND EXISTS "${EIGEN_INCLUDE_PATH}")
    ocv_include_directories(SYSTEM ${EIGEN_INCLUDE_PATH})
  endif()
endif()

何らかの理由で、コメントアウトされたセクションはチェック(Eigen3_FOUND)に合格していましたが、OpenCVの作業パスを提供していませんでした。私はCMake(CMakeコードを初めていじる)についての知識が限られているので、私が何をしたのか、またはそれから生じる可能性のある影響については本当にわかりません。なぜこれが起こったのですか?

1
AsianInvasi0n

複製されたEigenディレクトリを直接使用しないでください。 CMakeでビルドファイルを準備してから、ビルドフォルダーをEigen3_DIRに追加し、インストール/インクルードフォルダーをEIGEN_INCLUDE_PATHに追加する必要があります。

0
Ahmed