
Estoy intentando instalar OpenCV pero cuando intento compilar usando CMake, siempre aparece el error indicado en la pregunta, generalmente alrededor del 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....
Entonces, después de buscar en Google, decidí que solo necesitaba cambiar hacia dónde se dirige CMake para Eigen. Usando cmake-gui cambié Eigen3_DIR de /usr/lib/cmake/eigen3 a /usr/include/eigen3, siguiendo el consejo de respuestas de preguntas similares (no exactamente similares; simplemente recomendaron un cambio de ruta y dieron la última ruta).El problema surge cuando presiono configurar o intento generar: CMake revierte la entrada a la anterior.Intenté mirar algunos de los archivos CMake (CMakeCache.txt, CMakeLists.txt) pero realmente no sé qué estoy viendo, así que pensé en preguntarle a personas con más conocimientos que yo. También busqué en ambas rutas, y en ambos casos existen los archivos deseados: eigen3/Eigen/(archivos de encabezado) y eigen3/(archivos de configuración cmake).
Estoy ejecutando Ubuntu 18.04. Intenté instalar en dos directorios: uno en ~/opencv y otro en /mnt/Linux/opencv. En cada intento de compilación, elimino los archivos de compilación y reconstruyo OpenCV. Ambos han dado los mismos resultados. También intenté eliminar y volver a clonar la fuente, comenzando desde cero varias veces sin éxito.
¿Qué está sucediendo? ¿Me faltan configuraciones o incluso me estoy centrando en el problema? Cualquier ayuda será muy apreciada, guiada o alimentada.
Respuesta1
Probablemente esto sea un poco complicado, pero lo arreglé:
¿Qué me llevó a la solución?--No es OpenCV pero es el mismo tipo de problema.
En cmake/OpenCVFindLibsPerf.cmake, comenté esta parte del bloque Eigen:
#if(TARGET Eigen3::Eigen)
# Use Eigen3 imported target if possible
#list(APPEND OPENCV_LINKER_LIBS Eigen3::Eigen)
#set(HAVE_EIGEN 1)
así como también cambió la llamada find_package a
find_package(Eigen3 3.0.0)
El bloque de código Eigen completo:
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()
Por alguna razón, la sección comentada pasó la verificación (Eigen3_FOUND) pero no proporcionó ninguna ruta de trabajo para OpenCV. Tengo un conocimiento limitado de CMake (la primera vez que juego con el código de CMake), por lo que realmente no sé lo que hice ni las repercusiones que podrían surgir de ello. ¿Por qué pasó esto?
Respuesta2
No debe utilizar el directorio Eigen clonado directamente. Deberá preparar los archivos de compilación con CMake y luego agregar la carpeta de compilación a Eigen3_DIR y la carpeta de instalación/inclusión a EIGEN_INCLUDE_PATH.