OpenCV 컴파일 실패 "Eigen/Core: 해당 파일 또는 디렉터리 없음" - CMake 항목을 변경할 수 없음

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으로 변경했습니다(정확히 유사하지는 않습니다. 경로 변경을 권장하고 후자의 경로를 제공했습니다).구성을 누르거나 생성을 시도할 때 문제가 발생합니다. 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에 추가해야 합니다.

관련 정보