![OpenCV 编译失败“Eigen/Core:没有这样的文件或目录”——无法更改 CMake 条目](https://linux22.com/image/1592574/OpenCV%20%E7%BC%96%E8%AF%91%E5%A4%B1%E8%B4%A5%E2%80%9CEigen%2FCore%EF%BC%9A%E6%B2%A1%E6%9C%89%E8%BF%99%E6%A0%B7%E7%9A%84%E6%96%87%E4%BB%B6%E6%88%96%E7%9B%AE%E5%BD%95%E2%80%9D%E2%80%94%E2%80%94%E6%97%A0%E6%B3%95%E6%9B%B4%E6%94%B9%20CMake%20%E6%9D%A1%E7%9B%AE.png)
我正在尝试安装 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 配置文件)。
我正在运行 Ubuntu 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,并将 install/include 文件夹添加到 EIGEN_INCLUDE_PATH。