
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으로 변경했습니다(정확히 유사하지는 않습니다. 경로 변경을 권장하고 후자의 경로를 제공했습니다).구성을 누르거나 생성을 시도할 때 문제가 발생합니다. CMake는 항목을 이전 항목으로 되돌립니다.일부 CMake 파일(CMakeCache.txt, CMakeLists.txt)을 살펴보았지만 내가 무엇을 보고 있는지 잘 모르기 때문에 나보다 지식이 더 많은 사람들에게 물어봐야겠다고 생각했습니다. 또한 두 경로를 모두 살펴보았는데 두 경우 모두 원하는 파일(eigen3/Eigen/(헤더 파일) 및 eigen3/(cmake 구성 파일))이 존재합니다.
우분투 18.04를 실행 중입니다. 저는 ~/opencv에 한 번, /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에 추가하고 설치/포함 폴더를 EIGEN_INCLUDE_PATH에 추가해야 합니다.