文章目录

  • 前言
  • 第一次cmake-gui安装g2o
    • 安装cmake-gui
  • 第二次cmake-gui编译g2o
  • 第三次cmake-gui安装
  • 第四次cmake-gui安装g2o
  • 不太完美的解决cs.h但编译时....
  • 总结
  • 完美解决方案

前言

  最近编译运行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.hedge_se2.cpp    edge_se2_pointxy.h    vertex_se2.cppedge_se2.h      rand.h                vertex_point_xy.cpp  vertex_se2.hparameter_se2_offset.h parameter_se2_offset.cpptypes_tutorial_slam2d.h types_tutorial_slam2d.cppsimulator.h simulator.cppg2o_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_slam2dtutorial_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.hedge_se2.cpp    edge_se2_pointxy.h    vertex_se2.cppedge_se2.h      rand.h                vertex_point_xy.cpp  vertex_se2.hparameter_se2_offset.h parameter_se2_offset.cpptypes_tutorial_slam2d.h types_tutorial_slam2d.cppsimulator.h simulator.cppg2o_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_libraryg2o_coreg2o_solver_csparseg2o_csparse_extensiong2o_stuffcxsparseg2o_solver_cholmod${EIGEN3_LIBS}# ${CSPARSE_LIBRARY})add_executable(tutorial_slam2dtutorial_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.hedge_se2.cpp    edge_se2_pointxy.h    vertex_se2.cppedge_se2.h      rand.h                vertex_point_xy.cpp  vertex_se2.hparameter_se2_offset.h parameter_se2_offset.cpptypes_tutorial_slam2d.h types_tutorial_slam2d.cppsimulator.h simulator.cppg2o_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_libraryg2o_coreg2o_solver_csparseg2o_csparse_extensiong2o_ext_csparseg2o_stuffcxsparseg2o_solver_cholmod${EIGEN3_LIBS}# ${CSPARSE_LIBRARY})add_executable(tutorial_slam2dtutorial_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.cppse2.hvertex_point_xy.hedge_se2.cppedge_se2_pointxy.hvertex_se2.cppedge_se2.hrand.hvertex_point_xy.cppvertex_se2.hparameter_se2_offset.hparameter_se2_offset.cpptypes_tutorial_slam2d.htypes_tutorial_slam2d.cppsimulator.hsimulator.cppg2o_tutorial_slam2d_api.h)
find_package(Eigen3 REQUIRED)
find_package(CSparse)SET(G2O_LIBSg2o_clig2o_ext_freeglut_minimalg2o_simulatorg2o_solver_slam2d_linearg2o_types_icpg2o_types_slam2dg2o_coreg2o_interfaceg2o_solver_cholmodg2o_solver_csparseg2o_solver_structure_onlyg2o_types_sbag2o_types_slam3dg2o_csparse_extensiong2o_opengl_helperg2o_solver_denseg2o_stuffg2o_types_sclam2dg2o_parserg2o_solver_pcgg2o_types_datag2o_types_sim3cxsparse)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_slam2dtutorial_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_LIBSg2o_clig2o_ext_freeglut_minimalg2o_simulatorg2o_solver_slam2d_linearg2o_types_icpg2o_types_slam2dg2o_coreg2o_interfaceg2o_solver_csparseg2o_types_sbag2o_types_slam3dg2o_csparse_extensiong2o_opengl_helperg2o_solver_denseg2o_stuffg2o_types_sclam2dg2o_parserg2o_solver_pcgg2o_types_datag2o_types_sim3cxsparsecholmod )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}...)

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误[20190323已找到完美解决方案](非干货纯记录,可不看)相关推荐

  1. 编译驱动时出现Cannot open file trace.h错误

    编译驱动时出现"Cannot open file trace.h"错误 如题,用VS2013编译驱动是出现上述错误,原来是开启了WPP追踪导致的: 解决方案: 右键项目名-属性-W ...

  2. 我在windows10下,使用CMake gui 编译krita源码

    系列文章目录 文章目录 系列文章目录 前言 一.krita编译说明 二.使用步骤 前言 我在windows10下,使用CMake gui 编译krita源码 where is the source c ...

  3. Oracle报错:“ORA-02292:违反完整约束条件(XXX.FKXXX)- 已找到子记录

    删除表A的记录时,Oracle 报错:"ORA-02292:违反完整约束条件(XXX.FKXXX)- 已找到子记录. 1.找到以"FKXXX"为外键的表A的子表,直接运行 ...

  4. g2o学习记录(1)安装和运行其下面的unit_test项目

    文章目录 前言 安装 依赖项 运行unit_test 结语 前言   最近对新版本的g2o进行学习,相关的安装我这里就稍微说一下,以作记录,最主要的倒是它的unit_test的那个项目测试,调试得我真 ...

  5. 【ceph】cmake管理Ceph编译+Ceph工程目录+cmake 实战学习

    前言 Ceph cmake 工程 cmake生成的目录 cmake工程添加新模块(CMakeLists.txt) 添加动态库依赖 cmake导入外部链接库 *.cmake文件 cmake生成编译DEB ...

  6. Windows 10 上使用 CMake GUI 编译 Krita 源代码并使用 MinGW 64 作为构建工具

    krita系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参 ...

  7. 我在windows10下,使用CMake gui 编译krita源码,CMake gui报错:LibMyPaint_DIR-NOTFOUND

    系列文章目录 文章目录 系列文章目录 前言 一.原因 二.解决 1.引入库 前言 我在windows10下,使用CMake gui 编译krita源码 where is the source code ...

  8. 学习OpenCV3:Cmake+MinGW编译OpenCV

    1. 准备 1.1 下载OpenCV源码 OpenCV下载地址1:https://opencv.org/releases/ OpenCV下载地址2:https://github.com/opencv/ ...

  9. CMake笔记-使用CMake GUI生成MinGW的Makefiles及编译hiredis

    配置MinGW环境变量: 下载hiredis-master 设置CMAKE gui各个属性 先点configure,选择MinGW,在点Generate生产MinGW Makefiles即可! 进入D ...

最新文章

  1. Xonsh库——Python和Shell语法互通
  2. php socket
  3. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具收尾操作 | 关闭注入的动态库 | 恢复寄存器 | 脱离远程调试附着 )
  4. stl algorithm清单
  5. 使用原生JavaScript
  6. 【Linux】一步一步学Linux——dpkg-statoverride命令(277)
  7. 算法训练 字符串编辑c语言
  8. 你和女朋友的婚后老年生活!
  9. 第七章 假设检验(2)
  10. 道友们,听说你们书荒啦?十几万本够吗?用python几步就可爬取
  11. CSS+DIV:理论实战缺一不可
  12. Exchange2007获取OWA邮箱容量的代码
  13. 经典语录总结:识人篇
  14. spring中MessageSource的配置使用方法3--ResourceBundleMessageSource
  15. Materials Studio软件常见问题与解决方案(二)
  16. 安卓日志系统初探(带你了解Android日志系统的概貌)
  17. 玩具车c语言控制程序,蓝宙电子:八岁的小朋友可以这样编程控制小汽车
  18. 【Metasploit】MSF常用命令
  19. c语言main必须返回int,C语言 错误:’:: main’必须返回’int’
  20. TOM、网易、腾讯企业邮箱 | 邮箱登录入口你了解多少?

热门文章

  1. 入学吉他选购,有哪些适合初学者入门的吉他品牌推荐?
  2. JAVA C++异同
  3. UVP Phase运行机制的补充-Phase 的raise和drop机制
  4. 数据清洗整理基本操作(R:dplyr、tidyr、lubridate)
  5. NB-IoT、LoRa、eMTC、Zigbee、Sigfox、WiFi、蓝牙,谁能称霸物联网时代?
  6. 治疗口腔溃疡的穴位按摩方法
  7. (Python)使用SMTP发送QQ邮件
  8. 自定义桌面右键菜单-Win 10 版
  9. 深圳高中计算机老师招聘,深圳一所高中招聘20位老师,19人来自清华北大
  10. 计算机高级语言中数据的表现形式