文章目录
前言
最近编译运行g2o的example下的例子代码时,出现了cs.h no such file or directory
。后面考虑再三,打算重新编译一次g2o,这次不采用命令行的cmake而是cmake-gui,因为感觉像第一篇博文的安装过程,不太完美,我们运行unit_test和上一篇博文,总要修改eigen3的目录。还有这个错误就是我在编译example下的另外一个例子tutorial_slam2d出现的cs.h no such file or directory。
请你一定要了解的是,我本身已经是按照我在第一篇安装的,这次的安装只不过是想覆盖操作(也就是部分文件在/usr/lib的g2o目前还是改了eigen3),不过会不会继续发生,等后面这次的安装后的sudo make install再进行测试。
但是请你要知道,这是一次不太完美的记录,因为最终虽然解决了 cs.h no such file or directory
,但是还是没有单独编译example的例子成功,而完美cmake-gui编译g2o能把example下几乎所有example都编译成功(存在不存在有部分没编译的项目,本人无法保证),然而单独编译g2o的example下的例子的时候,存在部分单独项目编译成功,而部分没成功,比如tutorial_slam2d。最后的思考,大概是可能是由于本人本身CMakeList.txt还没完全掌握熟悉的缘故。如果有人能按照本文或本系列的博文编译成功,请尽快联系我。如果我能解决了,则会在本文更新(目前为止已经因为那个无法链接问题困扰了许久)。
强调一遍,不是干货!!没有十分特别新的东西(只不过可以安装g2o,是完整安装),只是我觉得这部分记录记录下来成为博客,以后如果再次遇到,能让我有所启发,仅为记录用途。
第一次cmake-gui安装g2o
安装cmake-gui
sudo apt-get install cmake-qt-gui
在g2o目录下创建build目录(我在第一次博文安装的那个,目前的build删除掉了)。
然后在cmake-gui中选择g2o的源
下一个选择g2o你创建的build
然后点击configure,然后生成后的点击绿色框的BUILD_CSPARSE勾上,另外两个先不勾,因为它并不主要。
然后再点击一次configure
接着点击Generate,为了保险我点了2次。
然后回到刚刚前面的build目录下,直接make和sudo make install。
make
sudo make install
但是在make过程中,必然会发生问题,一般g2o的源码不会出现问题,出现问题的是在其example下,这时候,你需要查看哪个部分出现问题。比如:
这个地方一看就知道意思是,没有链接库,其实通过系列博文的第一篇和第三篇,你很快可以排查出来,缺少了g2o_csparse_extension
。
所以你在example下的tutorial_slam2d下的CMakeList.txt中加入它。
这是我的配置:
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_FLAGS "-std=c++11")
# look for SuiteSparse, QGLViewer, and Eigen3.
list(APPEND CMAKE_MODULE_PATH ${g2o_SOURCE_DIR}/cmake_modules)
include_directories(${CSPARSE_INCLUDE_DIR})
add_library(tutorial_slam2d_library ${G2O_LIB_TYPE}
edge_se2_pointxy.cpp se2.h vertex_point_xy.h
edge_se2.cpp edge_se2_pointxy.h vertex_se2.cpp
edge_se2.h rand.h vertex_point_xy.cpp vertex_se2.h
parameter_se2_offset.h parameter_se2_offset.cpp
types_tutorial_slam2d.h types_tutorial_slam2d.cpp
simulator.h simulator.cpp
g2o_tutorial_slam2d_api.h
)
find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIRS})
set_target_properties(tutorial_slam2d_library PROPERTIES OUTPUT_NAME ${LIB_PREFIX}tutorial_slam2d)
target_link_libraries(tutorial_slam2d_library g2o_core g2o_solver_csparse g2o_csparse_extension ${CSPARSE_LIBRARY} )
add_executable(tutorial_slam2d
tutorial_slam2d.cpp
)
set_target_properties(tutorial_slam2d PROPERTIES OUTPUT_NAME tutorial_slam2d${EXE_POSTFIX})
target_link_libraries(tutorial_slam2d tutorial_slam2d_library)
其实我这部分中,加入了g2o源码下的cmake_modules的目录的那些东西,这个CMakelist.txt其实有一个地方存在明显问题,不知道你看出来没有,我后面会解决。
这时候你再编译下去,会发现这个错误已经没有了。但是会出现另一个错误,比如:
/usr/bin/ld: CMakeFiles/tutorial_slam2d.dir/tutorial_slam2d.cpp.o: undefined reference to symbol '_ZN3g2o18get_monotonic_timeEv'
/home/tanqiwei/Documents/environment/g2o/lib/libg2o_stuff.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
g2o/examples/tutorial_slam2d/CMakeFiles/tutorial_slam2d.dir/build.make:96: recipe for target '../bin/tutorial_slam2d' failed
make[2]: *** [../bin/tutorial_slam2d] Error 1
CMakeFiles/Makefile2:2480: recipe for target 'g2o/examples/tutorial_slam2d/CMakeFiles/tutorial_slam2d.dir/all' failed
make[1]: *** [g2o/examples/tutorial_slam2d/CMakeFiles/tutorial_slam2d.dir/all] Error 2
make[1]: *** 正在等待未完成的任务....
这想必你看了前面博文,应该知道怎么修改,无非是少了g2o_stuff,我们加入它。
后续操作基本是重复前两次博文的修改,这里不再赘述。
最后你看,我们已经编译出来了。
然后就是sudo make install ,这没什么好说的,至于输出则不展示了。
接下来,到~/Documents/environment/g2o/g2o/examples/tutorial_slam2d/build
例子中,去按照既定流程,cmake,make
一下。
很可惜的是,/usr/local/include/g2o/solvers/csparse/csparse_extension.h:27:16: fatal error: cs.h: 没有那个文件或目录
。依旧这么报错了。
这次再重新来一次,这次和上次的流程差不多,只不过。这里我们全部勾选,而且要一个地方需要重点注意。
第二次cmake-gui编译g2o
先清空g2o我们构建的build,然后再次使用cmake-gui,这次我们注意这里
按住configure后,你会发现,变化了。
这时候,先试试这两个一起勾选
目前这个地方先采用默认的,g2o的EXTERNAL下提供了csparse和其lib下提供了lib2o_ext_csparse.so。如果后面的确还是要那个问题,这里我们就下一次的时候改变。
和之前一样,点击两次configure和Generate,然后关闭cmake-gui,在build下面输入make和sudo make install。按照道理不应报错,如果有错,则按照前面的博文说的继续修改。
继续sudo make install。继续刚刚的操作,好吧,还是cs.h找不到该文件。
第三次cmake-gui安装
我们把前面的cmake-gui调用出来,把csparse的设置改成g2o所提供的,而不是我们安装依赖项的时候引入的。这次我们就把那个unit_test一起弄上好了,来个完整版,在你配置之前,请你记得你的build下面的给清理了。
对于CSPARSE_INCLUDE_DIR我设置为/home/tanqiwei/Documents/environment/g2o/EXTERNAL/csparse
。CSPARSE_LIBRARY设置为:/home/tanqiwei/Documents/environment/g2o/lib/libg2o_csparse_extension.so
。
现在,让我们再次点击两次configure,两次Generate,谨慎点,点多又不掉肉。
然后关掉cmake-gui,继续进行make和sudo make install。期间或许会报错,错误原因,我觉得在第一篇和第三篇以及本篇前面已经看过的,知道怎么处理了。但是我在运行过程中,倒是没有报错。
简直完美,现在还是sudo make install。然后跑到前面说的那个~/Documents/environment/g2o/g2o/examples/tutorial_slam2d/build
下继续我们的cmake和make操作。
可惜,还是报错了。/usr/local/include/g2o/solvers/csparse/csparse_extension.h:27:16: fatal error: cs.h: 没有那个文件或目录
瓦特,我花费这么多精力你还是报错了,没天理了。然后我直接在CMakeList.txt中添加这么一句话。
include_directories(${EIGEN3_INCLUDE_DIRS} ${CSPARSE_INCLUDE_DIR})
最后我才傻乎乎的发现,我原来忘记了,这个地方忘记修改了。
首先是cmake_modules的模块路径
# look for SuiteSparse, QGLViewer, and Eigen3.
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
之前是照搬了g2o的CMakeList.txt,所以这里现在才改成了${PROJECT_SOURCE_DIR}
。
其次是没有寻找find_package(CSparse)
。这是真的尴尬了。诸如此类小问题挺多的,最后修改的CMakeList.txt文件内容就是如下:
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_FLAGS "-std=c++11")
# look for SuiteSparse, QGLViewer, and Eigen3.
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
include_directories(${CSPARSE_INCLUDE_DIR})
add_library(tutorial_slam2d_library ${G2O_LIB_TYPE}
edge_se2_pointxy.cpp se2.h vertex_point_xy.h
edge_se2.cpp edge_se2_pointxy.h vertex_se2.cpp
edge_se2.h rand.h vertex_point_xy.cpp vertex_se2.h
parameter_se2_offset.h parameter_se2_offset.cpp
types_tutorial_slam2d.h types_tutorial_slam2d.cpp
simulator.h simulator.cpp
g2o_tutorial_slam2d_api.h
)
find_package(Eigen3 REQUIRED)
find_package(CSparse)
include_directories(${EIGEN3_INCLUDE_DIR} ${CSPARSE_INCLUDE_DIRS})
set_target_properties(tutorial_slam2d_library PROPERTIES OUTPUT_NAME ${LIB_PREFIX}tutorial_slam2d)
target_link_libraries(tutorial_slam2d_library
g2o_core
g2o_solver_csparse
g2o_csparse_extension
g2o_stuff
cxsparse
g2o_solver_cholmod
${EIGEN3_LIBS}
# ${CSPARSE_LIBRARY}
)
add_executable(tutorial_slam2d
tutorial_slam2d.cpp
)
set_target_properties(tutorial_slam2d PROPERTIES OUTPUT_NAME tutorial_slam2d${EXE_POSTFIX})
target_link_libraries(tutorial_slam2d tutorial_slam2d_library)
运行cmake后,这个报错了。
[100%] Linking CXX executable tutorial_slam2d
CMakeFiles/tutorial_slam2d.dir/tutorial_slam2d.cpp.o:在函数‘g2o::LinearSolverCSparse<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::solve(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double*, double*)’中:
tutorial_slam2d.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_]+0x19e):对‘g2o::csparse_extension::cs_cholsolsymb(cs_di_sparse const*, double*, cs_di_symbolic const*, double*, int*)’未定义的引用
tutorial_slam2d.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_]+0x1e9):对‘g2o::csparse_extension::writeCs2Octave(char const*, cs_di_sparse const*, bool)’未定义的引用
CMakeFiles/tutorial_slam2d.dir/tutorial_slam2d.cpp.o:在函数‘g2o::LinearSolverCSparse<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::solveBlocks(double**&, g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&)’中:
tutorial_slam2d.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEEE11solveBlocksERPPdRKNS_17SparseBlockMatrixIS3_EE[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEEE11solveBlocksERPPdRKNS_17SparseBlockMatrixIS3_EE]+0x307):对‘g2o::csparse_extension::cs_chol_workspace(cs_di_sparse const*, cs_di_symbolic const*, int*, double*)’未定义的引用
CMakeFiles/tutorial_slam2d.dir/tutorial_slam2d.cpp.o:在函数‘g2o::LinearSolverCSparse<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::solvePattern(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > > const&, g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&)’中:
tutorial_slam2d.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEEE12solvePatternERNS_17SparseBlockMatrixIS3_EERKSt6vectorISt4pairIiiESaISA_EERKS6_[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEEE12solvePatternERNS_17SparseBlockMatrixIS3_EERKSt6vectorISt4pairIiiESaISA_EERKS6_]+0x1eb):对‘g2o::csparse_extension::cs_chol_workspace(cs_di_sparse const*, cs_di_symbolic const*, int*, double*)’未定义的引用
collect2: error: ld returned 1 exit status
CMakeFiles/tutorial_slam2d.dir/build.make:96: recipe for target 'tutorial_slam2d' failed
make[2]: *** [tutorial_slam2d] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/tutorial_slam2d.dir/all' failed
make[1]: *** [CMakeFiles/tutorial_slam2d.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
第四次cmake-gui安装g2o
这就让我阿斯达了。凌乱了的感觉。我不放弃。主要是感觉可能是由于选择的cxparse的原因,因为我编译的上一次过程用的是g2o源码下面的。重新把build清除掉。然后选择的是默认的。
分别设置为:/usr/include/suitesparse
和/usr/lib/x86_64-linux-gnu/libcxsparse.so.3.1.4
。
等到再次编译的时候(几乎和第三次安装的过程一模一样),会发现报错,报的是这么个错(因为我全面就像上一次一样,全都勾选了,所以这个tutorial_slam2d也会编译)。
[ 40%] Linking CXX executable ../../../../bin/tutorial_slam2d
/usr/bin/ld: CMakeFiles/tutorial_slam2d.dir/tutorial_slam2d.cpp.o: undefined reference to symbol 'cs_symperm'
/home/tanqiwei/Documents/environment/g2o/lib/libg2o_ext_csparse.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
g2o/examples/tutorial_slam2d/CMakeFiles/tutorial_slam2d.dir/build.make:95: recipe for target '../bin/tutorial_slam2d' failed
make[2]: *** [../bin/tutorial_slam2d] Error 1
CMakeFiles/Makefile2:2886: recipe for target 'g2o/examples/tutorial_slam2d/CMakeFiles/tutorial_slam2d.dir/all' failed
make[1]: *** [g2o/examples/tutorial_slam2d/CMakeFiles/tutorial_slam2d.dir/all] Error 2
所以你需要CMakeList.txt中加入 g2o_ext_csparse,我的该example下的tutorial_slam2d的CMakeList.txt就改成了。
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_FLAGS "-std=c++11")
# look for SuiteSparse, QGLViewer, and Eigen3.
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
include_directories(${CSPARSE_INCLUDE_DIR})
add_library(tutorial_slam2d_library ${G2O_LIB_TYPE}
edge_se2_pointxy.cpp se2.h vertex_point_xy.h
edge_se2.cpp edge_se2_pointxy.h vertex_se2.cpp
edge_se2.h rand.h vertex_point_xy.cpp vertex_se2.h
parameter_se2_offset.h parameter_se2_offset.cpp
types_tutorial_slam2d.h types_tutorial_slam2d.cpp
simulator.h simulator.cpp
g2o_tutorial_slam2d_api.h
)
find_package(Eigen3 REQUIRED)
find_package(CSparse)
include_directories(${EIGEN3_INCLUDE_DIR} ${CSPARSE_INCLUDE_DIRS})
set_target_properties(tutorial_slam2d_library PROPERTIES OUTPUT_NAME ${LIB_PREFIX}tutorial_slam2d)
target_link_libraries(tutorial_slam2d_library
g2o_core
g2o_solver_csparse
g2o_csparse_extension
g2o_ext_csparse
g2o_stuff
cxsparse
g2o_solver_cholmod
${EIGEN3_LIBS}
# ${CSPARSE_LIBRARY}
)
add_executable(tutorial_slam2d
tutorial_slam2d.cpp
)
set_target_properties(tutorial_slam2d PROPERTIES OUTPUT_NAME tutorial_slam2d${EXE_POSTFIX})
target_link_libraries(tutorial_slam2d tutorial_slam2d_library)
然后后面编译都很顺利了。
不太完美的解决cs.h但编译时…
又报了这个错误,/usr/local/include/g2o/solvers/csparse/csparse_extension.h:27:16: fatal error: cs.h: 没有那个文件或目录。
最后又改来改去,感觉是CMakeList.txt写得有问题,我改成了如下:
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_FLAGS "-std=c++11")
# look for SuiteSparse, QGLViewer, and Eigen3.
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
# find g2o lib
find_package(G2O REQUIRED)
IF(G2O_FOUND)
include_directories(${G2O_INCLUDE_DIR})
message("G2O lib is found:" ${G2O_INCLUDE_DIR})
ENDIF(G2O_FOUND)
add_library(tutorial_slam2d_library ${G2O_LIB_TYPE}
edge_se2_pointxy.cpp
se2.h
vertex_point_xy.h
edge_se2.cpp
edge_se2_pointxy.h
vertex_se2.cpp
edge_se2.h
rand.h
vertex_point_xy.cpp
vertex_se2.h
parameter_se2_offset.h
parameter_se2_offset.cpp
types_tutorial_slam2d.h
types_tutorial_slam2d.cpp
simulator.h
simulator.cpp
g2o_tutorial_slam2d_api.h
)
find_package(Eigen3 REQUIRED)
find_package(CSparse)
SET(G2O_LIBS
g2o_cli
g2o_ext_freeglut_minimal
g2o_simulator
g2o_solver_slam2d_linear
g2o_types_icp
g2o_types_slam2d
g2o_core
g2o_interface
g2o_solver_cholmod
g2o_solver_csparse
g2o_solver_structure_only
g2o_types_sba
g2o_types_slam3d
g2o_csparse_extension
g2o_opengl_helper
g2o_solver_dense
g2o_stuff
g2o_types_sclam2d
g2o_parser
g2o_solver_pcg
g2o_types_data
g2o_types_sim3
cxsparse
)
include_directories(${EIGEN3_INCLUDE_DIR}
${CSPARSE_INCLUDE_DIR}
/usr/local/include/g2o/solvers/csparse
)
set_target_properties(tutorial_slam2d_library PROPERTIES OUTPUT_NAME ${LIB_PREFIX}tutorial_slam2d)
target_link_libraries(tutorial_slam2d_library
${G2O_LIBS}
)
add_executable(tutorial_slam2d
tutorial_slam2d.cpp
)
set_target_properties(tutorial_slam2d PROPERTIES OUTPUT_NAME tutorial_slam2d ${EXE_POSTFIX})
target_link_libraries(tutorial_slam2d tutorial_slam2d_library)
cs.h: 没有那个文件或目录的问题是没有了,但是无法编译通过,主要是编译链接的地方,说是定义问题。
[ 90%] Linking CXX executable tutorial_slam2d
CMakeFiles/tutorial_slam2d.dir/tutorial_slam2d.cpp.o:在函数‘g2o::LinearSolverCSparse<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::solve(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double*, double*)’中:
/usr/local/include/g2o/solvers/csparse/linear_solver_csparse.h:125:对‘g2o::csparse_extension::cs_cholsolsymb(cs_di_sparse const*, double*, cs_di_symbolic const*, double*, int*)’未定义的引用
/usr/local/include/g2o/solvers/csparse/linear_solver_csparse.h:129:对‘g2o::csparse_extension::writeCs2Octave(char const*, cs_di_sparse const*, bool)’未定义的引用
CMakeFiles/tutorial_slam2d.dir/tutorial_slam2d.cpp.o:在函数‘g2o::LinearSolverCSparse<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::solveBlocks(double**&, g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&)’中:
/usr/local/include/g2o/solvers/csparse/linear_solver_csparse.h:170:对‘g2o::csparse_extension::cs_chol_workspace(cs_di_sparse const*, cs_di_symbolic const*, int*, double*)’未定义的引用
CMakeFiles/tutorial_slam2d.dir/tutorial_slam2d.cpp.o:在函数‘g2o::LinearSolverCSparse<Eigen::Matrix<double, -1, -1, 0, -1, -1> >::solvePattern(g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > > const&, g2o::SparseBlockMatrix<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&)’中:
/usr/local/include/g2o/solvers/csparse/linear_solver_csparse.h:207:对‘g2o::csparse_extension::cs_chol_workspace(cs_di_sparse const*, cs_di_symbolic const*, int*, double*)’未定义的引用
collect2: error: ld returned 1 exit status
CMakeFiles/tutorial_slam2d.dir/build.make:95: recipe for target 'tutorial_slam2d' failed
make[3]: *** [tutorial_slam2d] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/tutorial_slam2d.dir/all' failed
make[2]: *** [CMakeFiles/tutorial_slam2d.dir/all] Error 2
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/tutorial_slam2d.dir/rule' failed
make[1]: *** [CMakeFiles/tutorial_slam2d.dir/rule] Error 2
Makefile:118: recipe for target 'tutorial_slam2d' failed
make: *** [tutorial_slam2d] Error 2
然而值得疑惑的是,这个问题在整体编译g2o的项目,其实也包括了这个例子的时候,全是没有问题的(这是值得另我疑惑的事情,所以我只能推测,在CMakeList.txt上还是配置存在了问题,我的CMake学习还不是十分的到位)。其实按照上面流程走便了后的g2o编译后,你会在bin目录下,看见自己编译成功了的slam2d
当你运行它,会出现结果。
只能说明一件事情,既然g2o我们能编译成功,至少在环境上是没问题的。而且当时谷歌前面的报错也没解决,说是某东西没安装,那依赖项其实早就安装了,所以那问题的产生原因,目前还不甚清楚吗。
但是看问题出错原因,个人感觉是链接器这部分产生了问题,然而相关的链接库都已经放了上去,目前为止,还没有更好的可以单独编译example下例子的解决方案。
总结
对于安装,使用CMake-gui可以完美安装g2o并把所有example甚至是unit_test的都可以编译成功。所报错的地方,也就是我们前面两篇博文所说的就可以修改。但是在单独编译example的情况下,存在编译无法链接成功的问题,如果在依赖项都已经安装的情况下,应该是CMakeList.txt的编写有问题,这一部分若是以后解决了,本篇博文就会更新。
下次直接是编写例子了,这些安装和运行部分就先这么过了。
------------------------------------------------------------2019年3月23日更新-----------------------------------------------------------------------
完美解决方案
最近继续用此g2o的时候,已经找到cs.h的完美解决方案,头文件找不到,还是因为相关头文件的原因,也就是需要修改CMakeList.txt。引入CSPARSE库,关于这个库模块的cmake文件在g2o的cmake_modules文件下FindCSparse.cmake文件,将之引入你报错的项目内,下面给的是一个CMakeList.txt解决该问题的示例,示例并不完整,另外就是我删除了一些东西,具体使用自行添加,我用…代表了一些东西的存在,这些东西可以忽略掉,主要看的是如何引入CSPARSE库。
############### dependencies ######################
list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules
# g2o(目前旧版本的g2o)引用
find_package( G2O REQUIRED )
include_directories( ${G2O_INCLUDE_DIRS} )
# 为了防止找不到cs.h问题
FIND_PACKAGE(CSparse)
SET(G2O_LIBS
g2o_cli
g2o_ext_freeglut_minimal
g2o_simulator
g2o_solver_slam2d_linear
g2o_types_icp
g2o_types_slam2d
g2o_core
g2o_interface
g2o_solver_csparse
g2o_types_sba
g2o_types_slam3d
g2o_csparse_extension
g2o_opengl_helper
g2o_solver_dense
g2o_stuff
g2o_types_sclam2d
g2o_parser
g2o_solver_pcg
g2o_types_data
g2o_types_sim3
cxsparse
cholmod )
include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include
....
${G2O_INCLUDE_DIR} # /旧版本
${CSPARSE_INCLUDE_DIR}
....
)
# Set link libraries
list(APPEND LINK_LIBS
...
${G2O_LIBS}
${CSPARSE_LIBRARY}
...
)