測試高博的視覺slam 第7講的實驗時
到對應的目錄下 ch7裏,創建build文件夾,進入,cmake.. make這個時候出了個問題。
程序編譯的時候,到這一行
#include <g2o/solvers/csparse/linear_solver_csparse.h>
報錯,報錯信息如題目所示
fatal error: g2o/solvers/eigen/linear_solver_eigen.h
後面的報錯信息,大致說的就是,不存在這個文件或者目錄。
安裝g2o的時候,說g2o的安裝文件是放在/usr/local/include/g2o裏
cd進去,發現根本就沒有eigen這個東西。
上網baidu吧,全是一些風馬牛不相及的東西,關鍵時刻還是得靠自己啊。
我們先去下好的g2o的源碼文件當中去看看,有沒有這個eigen文件
定位到源碼文件/g2o/solvers當中去,發下裏面有eigen這個文件夾!!!
點進去,發現這個文件夾下存在CMakeLists.txt文件,打開,代碼如下:
add_library(solver_eigen ${G2O_LIB_TYPE}
solver_eigen.cpp
linear_solver_eigen.h
)
set_target_properties(solver_eigen PROPERTIES OUTPUT_NAME ${LIB_PREFIX}solver_eigen)
if (APPLE)
set_target_properties(solver_eigen PROPERTIES INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib")
endif()
target_link_libraries(solver_eigen core)
install(TARGETS solver_eigen
EXPORT ${G2O_TARGETS_EXPORT_NAME}
RUNTIME DESTINATION ${RUNTIME_DESTINATION}
LIBRARY DESTINATION ${LIBRARY_DESTINATION}
ARCHIVE DESTINATION ${ARCHIVE_DESTINATION}
INCLUDES DESTINATION ${INCLUDES_DESTINATION}
)
file(GLOB headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h" "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp")
install(FILES ${headers} DESTINATION ${INCLUDES_INSTALL_DIR}/solvers/eigen)
從這個文件中,我們大致能看出來,之前報錯的linear_solver_eigen.h是加入的library中的,說明在在這一級是沒有問題的。
返回到上一級,還有一個CMakeLists.txt文件,我們打開,代碼如下:
add_subdirectory(pcg)
add_subdirectory(dense)
add_subdirectory(structure_only)
if(CSPARSE_FOUND)
add_subdirectory(csparse)
add_subdirectory(slam2d_linear)
endif()
if(CHOLMOD_FOUND)
add_subdirectory(cholmod)
endif(CHOLMOD_FOUND)
# Sparse Module of Eigen is stable starting from 3.1
if (DEFINED EIGEN3_VERSION)
if(${EIGEN3_VERSION} VERSION_GREATER "3.1.0" OR ${EIGEN3_VERSION} VERSION_EQUAL "3.1.0")
add_subdirectory(eigen)
endif()
endif()
可以看出來,在這裏,eigen的添加變得有條件的,條件是,當前系統安裝了eigen,並且eigen的版本要大於等於3.1。
如果你安裝了eigen,但不知道自己的eigen是什麼版本,可以去看這個帖子
https://blog.csdn.net/xiaoxiao133/article/details/82705460
我看了一下我的eigen版本,是最新的,沒有問題,這就很匪夷所思了,不管這些,我們先暫時暴力破解一下,直接把add_subdirectory(eigen)拿出來,放在第4行,直接無條件加入到library中。
重新cmake.. make sudo make install
再次編譯ch7下的程序,程序編譯無誤。