
Estou tentando instalar o OpenCV, mas quando tento compilar usando o CMake, sempre recebo o erro indicado na pergunta, geralmente em torno de 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....
Então, depois de pesquisar no Google, decidi que só preciso mudar o destino do CMake para o Eigen. Usando cmake-gui, mudei Eigen3_DIR de /usr/lib/cmake/eigen3 para /usr/include/eigen3, seguindo respostas de perguntas semelhantes (não exatamente semelhantes; eles apenas recomendaram uma mudança de caminho e forneceram o último caminho).O problema surge quando clico em configurar ou tento gerar: CMake reverte a entrada para a anterior.Tentei examinar alguns dos arquivos CMake (CMakeCache.txt, CMakeLists.txt), mas realmente não sei o que estou vendo, então decidi perguntar a pessoas com mais conhecimento do que eu. Também procurei nos dois caminhos e, em ambos os casos, os arquivos desejados existem - eigen3/Eigen/(arquivos de cabeçalho) e eigen3/(arquivos de configuração cmake).
Estou executando o Ubuntu 18.04. Tentei instalar em dois diretórios: uma vez em ~/opencv e outra em /mnt/Linux/opencv. Em cada tentativa de compilação, eu excluo os arquivos de construção e reconstruo o OpenCV. Ambos produziram os mesmos resultados. Também tentei excluir e clonar novamente a fonte, começando do zero várias vezes, sem sucesso.
O que está acontecendo? Estou faltando configurações ou até mesmo focando no problema? Qualquer ajuda será muito apreciada, orientada ou alimentada.
Responder1
Isso provavelmente é meio hackeado, mas eu consertei:
O que me levou à correção--não é OpenCV, mas é o mesmo tipo de problema.
Em cmake/OpenCVFindLibsPerf.cmake, comentei esta parte do bloco Eigen:
#if(TARGET Eigen3::Eigen)
# Use Eigen3 imported target if possible
#list(APPEND OPENCV_LINKER_LIBS Eigen3::Eigen)
#set(HAVE_EIGEN 1)
bem como alterou a chamada find_package para
find_package(Eigen3 3.0.0)
O bloco 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 alguma razão, a seção comentada passou na verificação (Eigen3_FOUND), mas não forneceu nenhum caminho de trabalho para o OpenCV. Tenho um conhecimento limitado do CMake (primeira vez mexendo com o código do CMake), então realmente não sei o que fiz ou qualquer uma das repercussões que podem advir disso. Por quê isso aconteceu?
Responder2
Você não deve usar o diretório Eigen clonado diretamente. Você precisará preparar arquivos de compilação com CMake e, em seguida, adicionar a pasta de compilação em Eigen3_DIR e a pasta de instalação/inclusão em EIGEN_INCLUDE_PATH.