g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

时间:2024-03-15 11:56:34

前言

  最近编译运行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学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)
g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)
g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  在g2o目录下创建build目录(我在第一次博文安装的那个,目前的build删除掉了)。

  然后在cmake-gui中选择g2o的源

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  下一个选择g2o你创建的build

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  然后点击configure,然后生成后的点击绿色框的BUILD_CSPARSE勾上,另外两个先不勾,因为它并不主要。

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  然后再点击一次configure

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  接着点击Generate,为了保险我点了2次。

  然后回到刚刚前面的build目录下,直接make和sudo make install。

make
sudo make install

  但是在make过程中,必然会发生问题,一般g2o的源码不会出现问题,出现问题的是在其example下,这时候,你需要查看哪个部分出现问题。比如:

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  这个地方一看就知道意思是,没有链接库,其实通过系列博文的第一篇第三篇,你很快可以排查出来,缺少了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其实有一个地方存在明显问题,不知道你看出来没有,我后面会解决

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  这时候你再编译下去,会发现这个错误已经没有了。但是会出现另一个错误,比如:

/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,我们加入它。

  后续操作基本是重复前两次博文的修改,这里不再赘述。

  最后你看,我们已经编译出来了。

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  然后就是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,这次我们注意这里

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  按住configure后,你会发现,变化了。

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  这时候,先试试这两个一起勾选

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  目前这个地方先采用默认的,g2o的EXTERNAL下提供了csparse和其lib下提供了lib2o_ext_csparse.so。如果后面的确还是要那个问题,这里我们就下一次的时候改变。

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  和之前一样,点击两次configure和Generate,然后关闭cmake-gui,在build下面输入make和sudo make install。按照道理不应报错,如果有错,则按照前面的博文说的继续修改。

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  继续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

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  现在,让我们再次点击两次configure,两次Generate,谨慎点,点多又不掉肉。

  然后关掉cmake-gui,继续进行make和sudo make install。期间或许会报错,错误原因,我觉得在第一篇和第三篇以及本篇前面已经看过的,知道怎么处理了。但是我在运行过程中,倒是没有报错。

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  简直完美,现在还是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)

  然后后面编译都很顺利了。

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

不太完美的解决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学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  当你运行它,会出现结果。

g2o学习记录(4)cmake-gui再次编译g2o及不太完美的处理cs.h错误(非干货纯记录,可不看)

  只能说明一件事情,既然g2o我们能编译成功,至少在环境上是没问题的。而且当时谷歌前面的报错也没解决,说是某东西没安装,那依赖项其实早就安装了,所以那问题的产生原因,目前还不甚清楚吗。

  但是看问题出错原因,个人感觉是链接器这部分产生了问题,然而相关的链接库都已经放了上去,目前为止,还没有更好的可以单独编译example下例子的解决方案。

总结

  对于安装,使用CMake-gui可以完美安装g2o并把所有example甚至是unit_test的都可以编译成功。所报错的地方,也就是我们前面两篇博文所说的就可以修改。但是在单独编译example的情况下,存在编译无法链接成功的问题,如果在依赖项都已经安装的情况下,应该是CMakeList.txt的编写有问题,这一部分若是以后解决了,本篇博文就会更新。
  下次直接是编写例子了,这些安装和运行部分就先这么过了。