
我正在嘗試安裝 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)
完整的特徵代碼區塊:
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。