视觉slam十四讲第二版 ch9 最新代码修正

原来的代码因为版本或者其他细节原因,有很多bug,要么c++版本不对,要么少链接几个库,新人用我下面发的cmake文件即可。

我的报错:

/usr/bin/ld: CMakeFiles/bundle_adjustment_g2o.dir/bundle_adjustment_g2o.cpp.o: in function `SolveBA(BALProblem&)':
bundle_adjustment_g2o.cpp:(.text+0x26e3): undefined reference to `g2o::csparse::CSparse::CSparse()'
/usr/bin/ld: CMakeFiles/bundle_adjustment_g2o.dir/bundle_adjustment_g2o.cpp.o: in function `g2o::LinearSolverCSparse<Eigen::Matrix<double, 9, 9, 0, 9, 9> >::init()':
bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE4initEv[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE4initEv]+0xd): undefined reference to `g2o::csparse::CSparse::freeSymbolic()'
/usr/bin/ld: CMakeFiles/bundle_adjustment_g2o.dir/bundle_adjustment_g2o.cpp.o: in function `g2o::LinearSolverCSparse<Eigen::Matrix<double, 9, 9, 0, 9, 9> >::~LinearSolverCSparse()':
bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEED0Ev[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEED5Ev]+0x2b): undefined reference to `g2o::csparse::CSparse::~CSparse()'
/usr/bin/ld: CMakeFiles/bundle_adjustment_g2o.dir/bundle_adjustment_g2o.cpp.o: in function `g2o::LinearSolverCSparse<Eigen::Matrix<double, 9, 9, 0, 9, 9> >::~LinearSolverCSparse()':
bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEED2Ev[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEED5Ev]+0x24): undefined reference to `g2o::csparse::CSparse::~CSparse()'
/usr/bin/ld: CMakeFiles/bundle_adjustment_g2o.dir/bundle_adjustment_g2o.cpp.o: in function `g2o::BlockSolver<g2o::BlockSolverTraits<9, 3> >::init(g2o::SparseOptimizer*, bool)':
bundle_adjustment_g2o.cpp:(.text._ZN3g2o11BlockSolverINS_17BlockSolverTraitsILi9ELi3EEEE4initEPNS_15SparseOptimizerEb[_ZN3g2o11BlockSolverINS_17BlockSolverTraitsILi9ELi3EEEE4initEPNS_15SparseOptimizerEb]+0x5c): undefined reference to `g2o::csparse::CSparse::freeSymbolic()'
/usr/bin/ld: CMakeFiles/bundle_adjustment_g2o.dir/bundle_adjustment_g2o.cpp.o: in function `g2o::BlockSolver<g2o::BlockSolverTraits<9, 3> >::~BlockSolver()':
bundle_adjustment_g2o.cpp:(.text._ZN3g2o11BlockSolverINS_17BlockSolverTraitsILi9ELi3EEEED2Ev[_ZN3g2o11BlockSolverINS_17BlockSolverTraitsILi9ELi3EEEED5Ev]+0xa1): undefined reference to `g2o::csparse::CSparse::~CSparse()'
/usr/bin/ld: CMakeFiles/bundle_adjustment_g2o.dir/bundle_adjustment_g2o.cpp.o: in function `SolveBA(BALProblem&) [clone .cold]':
bundle_adjustment_g2o.cpp:(.text.unlikely+0x85): undefined reference to `g2o::csparse::CSparse::~CSparse()'
/usr/bin/ld: CMakeFiles/bundle_adjustment_g2o.dir/bundle_adjustment_g2o.cpp.o: in function `g2o::LinearSolverCSparse<Eigen::Matrix<double, 9, 9, 0, 9, 9> >::fillCSparse(g2o::SparseBlockMatrix<Eigen::Matrix<double, 9, 9, 0, 9, 9> > const&, bool)':
bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE11fillCSparseERKNS_17SparseBlockMatrixIS3_EEb[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE11fillCSparseERKNS_17SparseBlockMatrixIS3_EEb]+0x64): undefined reference to `g2o::csparse::CSparse::sparseView()'
/usr/bin/ld: CMakeFiles/bundle_adjustment_g2o.dir/bundle_adjustment_g2o.cpp.o: in function `g2o::LinearSolverCSparse<Eigen::Matrix<double, 9, 9, 0, 9, 9> >::solveBlocks_impl(g2o::SparseBlockMatrix<Eigen::Matrix<double, 9, 9, 0, 9, 9> > const&, std::function<void (g2o::MarginalCovarianceCholesky&)>)':
bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE]+0x3b): undefined reference to `g2o::csparse::CSparse::hasSymbolic() const'
/usr/bin/ld: bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE]+0x5d): undefined reference to `g2o::csparse::CSparse::factorize()'
/usr/bin/ld: bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE]+0x79): undefined reference to `g2o::csparse::CSparse::factor()'
/usr/bin/ld: bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE]+0xd9): undefined reference to `g2o::csparse::CSparse::freeFactor()'
/usr/bin/ld: bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE]+0xed): undefined reference to `g2o::csparse::CSparse::choleskyNz() const'
/usr/bin/ld: bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE]+0x145): undefined reference to `g2o::csparse::CSparse::analyze()'
/usr/bin/ld: bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE]+0x357): undefined reference to `g2o::csparse::CSparse::amd(g2o::csparse::CSparse::SparseView const&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&)'
/usr/bin/ld: bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE16solveBlocks_implERKNS_17SparseBlockMatrixIS3_EESt8functionIFvRNS_26MarginalCovarianceCholeskyEEE]+0x45b): undefined reference to `g2o::csparse::CSparse::analyze_p(int*)'
/usr/bin/ld: CMakeFiles/bundle_adjustment_g2o.dir/bundle_adjustment_g2o.cpp.o: in function `g2o::LinearSolverCSparse<Eigen::Matrix<double, 9, 9, 0, 9, 9> >::solve(g2o::SparseBlockMatrix<Eigen::Matrix<double, 9, 9, 0, 9, 9> > const&, double*, double*)':
bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_]+0x3f): undefined reference to `g2o::csparse::CSparse::hasSymbolic() const'
/usr/bin/ld: bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_]+0x75): undefined reference to `g2o::csparse::CSparse::solve(double*, double*) const'
/usr/bin/ld: bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_]+0xaa): undefined reference to `g2o::csparse::CSparse::choleskyNz() const'
/usr/bin/ld: bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_]+0xfd): undefined reference to `g2o::csparse::CSparse::analyze()'
/usr/bin/ld: bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_]+0x2aa): undefined reference to `g2o::csparse::CSparse::writeSparse(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
/usr/bin/ld: bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_]+0x39f): undefined reference to `g2o::csparse::CSparse::amd(g2o::csparse::CSparse::SparseView const&, Eigen::Matrix<int, -1, 1, 0, -1, 1>&)'
/usr/bin/ld: bundle_adjustment_g2o.cpp:(.text._ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_[_ZN3g2o19LinearSolverCSparseIN5Eigen6MatrixIdLi9ELi9ELi0ELi9ELi9EEEE5solveERKNS_17SparseBlockMatrixIS3_EEPdS9_]+0x4ab): undefined reference to `g2o::csparse::CSparse::analyze_p(int*)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/bundle_adjustment_g2o.dir/build.make:86:bundle_adjustment_g2o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:107:CMakeFiles/bundle_adjustment_g2o.dir/all] 错误 2
make: *** [Makefile:84:all] 错误 2

很明显是缺少链接库,查了很多资料,都是在说没有装库,但是我使用locate命令查找发现库是有的,然后怀疑是没有链接对应库。索性在构建的库目录(g2o/build/lib)中查找关键字csparse,果然发现了一个csparse的库g2o_solver_csparse没有链接:

然后将这个库和fmt库补充链接上,我的问题就解决了。 以下是修改后的cmake文件内容:

cmake_minimum_required(VERSION 2.8)

project(bundle_adjustment)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-O3 -std=c++17")

LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

Find_Package(G2O REQUIRED)
Find_Package(Ceres REQUIRED)
Find_Package(Sophus REQUIRED)
Find_Package(CSparse REQUIRED)

SET(G2O_LIBS g2o_csparse_extension g2o_stuff g2o_core cxsparse g2o_solver_csparse)

add_library(bal_common common.cpp)
add_executable(bundle_adjustment_g2o bundle_adjustment_g2o.cpp)
add_executable(bundle_adjustment_ceres bundle_adjustment_ceres.cpp)

target_link_libraries(bundle_adjustment_ceres ${CERES_LIBRARIES} bal_common)
target_link_libraries(bundle_adjustment_g2o ${G2O_LIBS} bal_common fmt::fmt)

注意:我把包含头文件的内容删除了,因为一般来说你编译了一个库,再执行install之后头文件默认安装到了/usr/local/include或/usr/include中,这正是gcc编译器默认查找路径(如果不是的话建议查教程将这两个路径设置成默认路径

猜你喜欢

转载自blog.csdn.net/whitephantom1/article/details/132974834