
Ich versuche, OpenCV zu installieren, aber wenn ich versuche, mit CMake zu kompilieren, erhalte ich immer den in der Frage angegebenen Fehler, normalerweise etwa 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....
Nach einigem Googeln entschied ich, dass ich nur ändern muss, wohin CMake für Eigen geht. Mithilfe von cmake-gui änderte ich Eigen3_DIR von /usr/lib/cmake/eigen3 in /usr/include/eigen3, auf Anraten von Antworten auf ähnliche Fragen (nicht genau ähnlich; sie empfahlen nur eine Pfadänderung und gaben den letzteren Pfad an).Das Problem tritt auf, wenn ich auf „Konfigurieren“ klicke oder versuche zu generieren: CMake setzt den Eintrag auf den vorherigen zurück.Ich habe versucht, mir einige der CMake-Dateien (CMakeCache.txt, CMakeLists.txt) anzusehen, aber ich weiß nicht wirklich, was ich mir da anschaue, also dachte ich, ich frage Leute, die mehr wissen als ich. Ich habe auch in beiden Pfaden nachgesehen, und in beiden Fällen sind die gewünschten Dateien vorhanden – eigen3/Eigen/(Headerdateien) und eigen3/(CMake-Konfigurationsdateien).
Ich verwende Ubuntu 18.04. Ich habe versucht, es in zwei Verzeichnissen zu installieren: einmal in ~/opencv und einmal in /mnt/Linux/opencv. Bei jedem Kompilierversuch lösche ich die Build-Dateien und baue OpenCV neu auf. Beides hat zum gleichen Ergebnis geführt. Ich habe auch versucht, die Quelle zu löschen und neu zu klonen, und dabei mehrmals von vorne angefangen, aber ohne Erfolg.
Was ist los? Fehlen mir Einstellungen oder liegt mir das Problem überhaupt nicht? Jede Hilfe wird sehr geschätzt, geleitet oder weitergeleitet.
Antwort1
Das ist wahrscheinlich ein bisschen hackig, aber ich habe es behoben:
Was hat mich zur Lösung geführt?--es ist nicht OpenCV, aber es ist dieselbe Art von Problem.
In cmake/OpenCVFindLibsPerf.cmake habe ich diesen Teil des Eigen-Blocks auskommentiert:
#if(TARGET Eigen3::Eigen)
# Use Eigen3 imported target if possible
#list(APPEND OPENCV_LINKER_LIBS Eigen3::Eigen)
#set(HAVE_EIGEN 1)
sowie den find_package-Aufruf geändert in
find_package(Eigen3 3.0.0)
Der vollständige Eigen-Codeblock:
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()
Aus irgendeinem Grund hat der auskommentierte Abschnitt die Prüfung bestanden (Eigen3_FOUND), aber keinen funktionierenden Pfad für OpenCV bereitgestellt. Ich habe nur begrenzte Kenntnisse von CMake (habe zum ersten Mal mit CMake-Code herumgespielt), also weiß ich wirklich nicht, was ich getan habe oder welche Auswirkungen es haben könnte. Warum ist das passiert?
Antwort2
Sie sollten das geklonte Eigen-Verzeichnis nicht direkt verwenden. Sie müssen Build-Dateien mit CMake vorbereiten und dann den Build-Ordner zu Eigen3_DIR und den Install/Include-Ordner zu EIGEN_INCLUDE_PATH hinzufügen.