
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 構成ファイル)) が存在します。
Ubuntu 18.04 を実行しています。2 つのディレクトリにインストールしてみました。1 つは ~/opencv、もう 1 つは /mnt/Linux/opencv です。コンパイルを試行するたびに、ビルド ファイルを削除して OpenCV を再構築します。どちらも同じ結果になりました。また、ソースを削除して再クローンし、最初からやり直すことも何度か試みましたが、効果はありませんでした。
何が起こっているのでしょうか? 設定が足りないのでしょうか、それとも問題に焦点を当てているのでしょうか? どのような助言でも大歓迎です。ご指導、ご助言をお願いします。
答え1
これはちょっとハックっぽいかもしれませんが、修正しました:
私がこの修正に至った理由--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 コードを扱うのは初めて)、自分が何をしたのか、またそれがどのような影響をもたらすのか、まったくわかりません。なぜこのようなことが起きたのでしょうか。
答え2
クローンされた Eigen ディレクトリを直接使用しないでください。CMake を使用してビルド ファイルを準備し、ビルド フォルダーを Eigen3_DIR に追加し、install/include フォルダーを EIGEN_INCLUDE_PATH に追加する必要があります。