[Bug集合]undefined reference to `g2o::csparse_extension::writeCs2Octave

博客指出一般是g2o没用好,并给出参考文章链接。同时列举了使用g2o时可能出现的一系列错误,如`undefined reference`错误,以及`no matching function for call`错误等,还展示了编译过程中`make`命令出现的错误信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般是g2o没用好。参考这篇文章。https://blog.youkuaiyun.com/unlimitedai/article/details/88698597

可能出现以下问题:

../../lib/libmyslam.so: undefined reference to `g2o::csparse_extension::writeCs2Octave(char const*, cs_di_sparse const*, bool)'
../../lib/libmyslam.so: undefined reference to `cs_di_amd'
../../lib/libmyslam.so: undefined reference to `cs_di_nfree'
../../lib/libmyslam.so: undefined reference to `cs_di_calloc'
../../lib/libmyslam.so: undefined reference to `cs_di_cumsum'
../../lib/libmyslam.so: undefined reference to `cs_di_symperm'
../../lib/libmyslam.so: undefined reference to `cs_di_pinv'
../../lib/libmyslam.so: undefined reference to `cs_di_counts'
../../lib/libmyslam.so: undefined reference to `cs_di_malloc'
../../lib/libmyslam.so: undefined reference to `cs_di_spfree'
../../lib/libmyslam.so: undefined reference to `g2o::csparse_extension::cs_cholsolsymb(cs_di_sparse const*, double*, cs_di_symbolic const*, double*, int*)'
../../lib/libmyslam.so: undefined reference to `cs_di_free'
../../lib/libmyslam.so: undefined reference to `cs_di_sfree'
../../lib/libmyslam.so: undefined reference to `cs_di_schol'
../../lib/libmyslam.so: undefined reference to `cs_di_post'
../../lib/libmyslam.so: undefined reference to `g2o::csparse_extension::cs_chol_workspace(cs_di_sparse const*, cs_di_symbolic const*, int*, double*)'
../../lib/libmyslam.so: undefined reference to `cs_di_etree'
collect2: error: ld returned 1 exit status

home/paul/rtabmap/corelib/src/OptimizerG2O.cpp: In member function ‘virtual std::map<int, rtabmap::Transform> rtabmap::OptimizerG2O::optimize(int, const std::map<int, rtabmap::Transform>&, const std::multimap<int, rtabmap::Link>&, std::cxx11::list<std::map<int, rtabmap::Transform> >, double, int*)’:
/home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:200:50: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<-1, -1> >::BlockSolver(SlamLinearEigenSolver*&)’
blockSolver = new SlamBlockSolver(linearSolver);
^
In file included from /usr/local/include/g2o/core/block_solver.h:199:0,
from /home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:42:
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: candidate: g2o::BlockSolver::BlockSolver(std::unique_ptr) [with Traits = g2o::BlockSolverTraits<-1, -1>; typename Traits::LinearSolverType = g2o::LinearSolver<Eigen::Matrix<double, -1, -1> >]
BlockSolver::BlockSolver(std::unique_ptr linearSolver)
^
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: no known conversion for argument 1 from ‘SlamLinearEigenSolver* {aka g2o::LinearSolverEigen<Eigen::Matrix<double, -1, -1> >}’ to ‘std::unique_ptr<g2o::LinearSolver<Eigen::Matrix<double, -1, -1> >, std::default_delete<g2o::LinearSolver<Eigen::Matrix<double, -1, -1> > > >’
/home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:208:50: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<-1, -1> >::BlockSolver(SlamLinearCholmodSolver
&)’
blockSolver = new SlamBlockSolver(linearSolver);
^
In file included from /usr/local/include/g2o/core/block_solver.h:199:0,
from /home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:42:
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: candidate: g2o::BlockSolver::BlockSolver(std::unique_ptr) [with Traits = g2o::BlockSolverTraits<-1, -1>; typename Traits::LinearSolverType = g2o::LinearSolver<Eigen::Matrix<double, -1, -1> >]
BlockSolver::BlockSolver(std::unique_ptr linearSolver)
^
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: no known conversion for argument 1 from ‘SlamLinearCholmodSolver* {aka g2o::LinearSolverCholmod<Eigen::Matrix<double, -1, -1> >}’ to ‘std::unique_ptr<g2o::LinearSolver<Eigen::Matrix<double, -1, -1> >, std::default_delete<g2o::LinearSolver<Eigen::Matrix<double, -1, -1> > > >’
/home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:217:50: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<-1, -1> >::BlockSolver(SlamLinearCSparseSolver
&)’
blockSolver = new SlamBlockSolver(linearSolver);
^
In file included from /usr/local/include/g2o/core/block_solver.h:199:0,
from /home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:42:
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: candidate: g2o::BlockSolver::BlockSolver(std::unique_ptr) [with Traits = g2o::BlockSolverTraits<-1, -1>; typename Traits::LinearSolverType = g2o::LinearSolver<Eigen::Matrix<double, -1, -1> >]
BlockSolver::BlockSolver(std::unique_ptr linearSolver)
^
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: no known conversion for argument 1 from ‘SlamLinearCSparseSolver* {aka g2o::LinearSolverCSparse<Eigen::Matrix<double, -1, -1> >}’ to ‘std::unique_ptr<g2o::LinearSolver<Eigen::Matrix<double, -1, -1> >, std::default_delete<g2o::LinearSolver<Eigen::Matrix<double, -1, -1> > > >’
/home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:225:50: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<-1, -1> >::BlockSolver(SlamLinearPCGSolver
&)’
blockSolver = new SlamBlockSolver(linearSolver);
^
In file included from /usr/local/include/g2o/core/block_solver.h:199:0,
from /home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:42:
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: candidate: g2o::BlockSolver::BlockSolver(std::unique_ptr) [with Traits = g2o::BlockSolverTraits<-1, -1>; typename Traits::LinearSolverType = g2o::LinearSolver<Eigen::Matrix<double, -1, -1> >]
BlockSolver::BlockSolver(std::unique_ptr linearSolver)
^
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: no known conversion for argument 1 from ‘SlamLinearPCGSolver* {aka g2o::LinearSolverPCG<Eigen::Matrix<double, -1, -1> >}’ to ‘std::unique_ptr<g2o::LinearSolver<Eigen::Matrix<double, -1, -1> >, std::default_delete<g2o::LinearSolver<Eigen::Matrix<double, -1, -1> > > >’
/home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:230:80: error: no matching function for call to ‘g2o::OptimizationAlgorithmGaussNewton::OptimizationAlgorithmGaussNewton(SlamBlockSolver
&)’
optimizer.setAlgorithm(new g2o::OptimizationAlgorithmGaussNewton(blockSolver));
^
In file included from /home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:45:0:
/usr/local/include/g2o/core/optimization_algorithm_gauss_newton.h:46:16: note: candidate: g2o::OptimizationAlgorithmGaussNewton::OptimizationAlgorithmGaussNewton(std::unique_ptrg2o::Solver)
explicit OptimizationAlgorithmGaussNewton(std::unique_ptr solver);
^
/usr/local/include/g2o/core/optimization_algorithm_gauss_newton.h:46:16: note: no known conversion for argument 1 from ‘SlamBlockSolver* {aka g2o::BlockSolver<g2o::BlockSolverTraits<-1, -1> >}’ to ‘std::unique_ptrg2o::Solver’
/home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:234:78: error: no matching function for call to ‘g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(SlamBlockSolver
&)’
optimizer.setAlgorithm(new g2o::OptimizationAlgorithmLevenberg(blockSolver));
^
In file included from /home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:46:0:
/usr/local/include/g2o/core/optimization_algorithm_levenberg.h:47:16: note: candidate: g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(std::unique_ptrg2o::Solver)
explicit OptimizationAlgorithmLevenberg(std::unique_ptr solver);
^
/usr/local/include/g2o/core/optimization_algorithm_levenberg.h:47:16: note: no known conversion for argument 1 from ‘SlamBlockSolver* {aka g2o::BlockSolver<g2o::BlockSolverTraits<-1, -1> >*}’ to ‘std::unique_ptrg2o::Solver’
/home/paul/rtabmap/corelib/src/OptimizerG2O.cpp: In member function ‘virtual std::map<int, rtabmap::Transform> rtabmap::OptimizerG2O::optimizeBA(int, const std::map<int, rtabmap::Transform>&, const std::multimap<int, rtabmap::Link>&, const std::map<int, rtabmap::CameraModel>&, std::map<int, cv::Point3
>&, const std::map<int, std::map<int, cv::Point3
> >&, std::set)’:
/home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:699:76: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::LinearSolverType
&)’
g2o::BlockSolver_6_3 * solver_ptr = new g2o::BlockSolver_6_3(linearSolver);
^
In file included from /usr/local/include/g2o/core/block_solver.h:199:0,
from /home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:42:
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: candidate: g2o::BlockSolver::BlockSolver(std::unique_ptr) [with Traits = g2o::BlockSolverTraits<6, 3>; typename Traits::LinearSolverType = g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> >]
BlockSolver::BlockSolver(std::unique_ptr linearSolver)
^
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: no known conversion for argument 1 from ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::LinearSolverType* {aka g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> >}’ to ‘std::unique_ptr<g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> >, std::default_delete<g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> > > >’
/home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:704:79: error: no matching function for call to ‘g2o::OptimizationAlgorithmGaussNewton::OptimizationAlgorithmGaussNewton(g2o::BlockSolver_6_3
&)’
optimizer.setAlgorithm(new g2o::OptimizationAlgorithmGaussNewton(solver_ptr));
^
In file included from /home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:45:0:
/usr/local/include/g2o/core/optimization_algorithm_gauss_newton.h:46:16: note: candidate: g2o::OptimizationAlgorithmGaussNewton::OptimizationAlgorithmGaussNewton(std::unique_ptrg2o::Solver)
explicit OptimizationAlgorithmGaussNewton(std::unique_ptr solver);
^
/usr/local/include/g2o/core/optimization_algorithm_gauss_newton.h:46:16: note: no known conversion for argument 1 from ‘g2o::BlockSolver_6_3* {aka g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >}’ to ‘std::unique_ptrg2o::Solver’
/home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:709:77: error: no matching function for call to ‘g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(g2o::BlockSolver_6_3
&)’
optimizer.setAlgorithm(new g2o::OptimizationAlgorithmLevenberg(solver_ptr));
^
In file included from /home/paul/rtabmap/corelib/src/OptimizerG2O.cpp:46:0:
/usr/local/include/g2o/core/optimization_algorithm_levenberg.h:47:16: note: candidate: g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(std::unique_ptrg2o::Solver)
explicit OptimizationAlgorithmLevenberg(std::unique_ptr solver);
^
/usr/local/include/g2o/core/optimization_algorithm_levenberg.h:47:16: note: no known conversion for argument 1 from ‘g2o::BlockSolver_6_3* {aka g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >*}’ to ‘std::unique_ptrg2o::Solver'

 

/home/lzp/slamtest/graduationcode/p3/poseestimation/pose_estimation_3d2d.cpp: In function ‘void bundleAdjustment(std::vector<cv::Point3_<float> >, std::vector<cv::Point_<float> >, const cv::Mat&, cv::Mat&, cv::Mat&)’:
/home/lzp/slamtest/graduationcode/p3/poseestimation/pose_estimation_3d2d.cpp:154:50: error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::LinearSolverType*&)’
     Block* solver_ptr = new Block ( linearSolver );     // 矩阵块求解器
                                                  ^
/home/lzp/slamtest/graduationcode/p3/poseestimation/pose_estimation_3d2d.cpp:154:50: note: candidate is:
In file included from /usr/local/include/g2o/core/block_solver.h:199:0,
                 from /home/lzp/slamtest/graduationcode/p3/poseestimation/pose_estimation_3d2d.cpp:10:
/usr/local/include/g2o/core/block_solver.hpp:40:1: note: g2o::BlockSolver<Traits>::BlockSolver(std::unique_ptr<typename Traits::LinearSolverType>) [with Traits = g2o::BlockSolverTraits<6, 3>; typename Traits::LinearSolverType = g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> >]
 BlockSolver<Traits>::BlockSolver(std::unique_ptr<LinearSolverType> linearSolver)
 ^
/usr/local/include/g2o/core/block_solver.hpp:40:1: note:   no known conversion for argument 1 from ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::LinearSolverType* {aka g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> >*}’ to ‘std::unique_ptr<g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> >, std::default_delete<g2o::LinearSolver<Eigen::Matrix<double, 6, 6, 0> > > >’
/home/lzp/slamtest/graduationcode/p3/poseestimation/pose_estimation_3d2d.cpp:155:104: error: no matching function for call to ‘g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(Block*&)’
     g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr );
                                                                                                        ^
/home/lzp/slamtest/graduationcode/p3/poseestimation/pose_estimation_3d2d.cpp:155:104: note: candidate is:
In file included from /home/lzp/slamtest/graduationcode/p3/poseestimation/pose_estimation_3d2d.cpp:11:0:
/usr/local/include/g2o/core/optimization_algorithm_levenberg.h:47:16: note: g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(std::unique_ptr<g2o::Solver>)
       explicit OptimizationAlgorithmLevenberg(std::unique_ptr<Solver> solver);
                ^
/usr/local/include/g2o/core/optimization_algorithm_levenberg.h:47:16: note:   no known conversion for argument 1 from ‘Block* {aka g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >*}’ to ‘std::unique_ptr<g2o::Solver>’
make[2]: *** [CMakeFiles/pose_estimation_3d2d.dir/pose_estimation_3d2d.cpp.o] 错误 1
make[1]: *** [CMakeFiles/pose_estimation_3d2d.dir/all] 错误 2
make: *** [all] 错误 2

<think>好的,我现在需要帮助用户解决在使用GSL库时遇到的未定义符号错误,具体是`_gsl_interp_cspline_periodic`的问题。首先,我应该回忆一下GSL库的基本结构和常见的链接问题。 用户提到了`gsl_interp_alloc`函数,这个函数用于分配插值对象的空间,而`gsl_interp_cspline_periodic`可能是一个插值类型。根据GSL文档,周期性三次样条插值的类型应该是`gsl_interp_cspline_periodic`,但可能在较旧的GSL版本中不存在,或者在用户使用的版本中没有正确编译进去。 接下来,用户提到他们参考了引用[2],其中涉及在Visual Studio中编译GSL的方法。可能用户是在Windows环境下使用Visual Studio,并且可能使用了提供的静态库或动态库。但编译好的库可能存在版本不匹配的问题,或者没有包含所需的插值类型。 我需要分步骤分析可能的原因: 1. **版本兼容性**:检查用户使用的GSL版本是否支持`gsl_interp_cspline_periodic`。这个插值类型可能是在较新的版本中添加的,如果用户使用的是旧版GSL,可能不存在这个符号。 2. **链接库的问题**:确认用户是否正确链接了GSL库。在编译命令中是否包含了`-lgsl`和`-lgslcblas`(在Linux下),或者在Visual Studio的项目设置中是否正确添加了库路径和库文件。 3. **编译器配置**:在Windows环境下,可能需要使用特定的编译器选项或者确保库文件是针对正确的运行时库(如MD/MDd)编译的,避免运行时库不匹配导致的链接错误。 4. **头文件版本**:用户可能包含了旧版本的头文件,导致编译器认为`gsl_interp_cspline_periodic`存在,但实际链接的库文件没有该符号,从而引发未定义错误。 5. **静态库与动态库**:用户是否同时链接了静态库和动态库,或者存在版本冲突?例如,引用的优快云资源可能提供的库文件未包含所有插值类型,或者编译时未启用某些选项。 接下来,我需要验证这些可能性。例如,查阅GSL的官方文档,确认`gsl_interp_cspline_periodic`的可用版本。例如,GSL 2.5及以后版本可能支持该插值类型。如果用户使用的是旧版,可能需要升级。 另外,用户可能在代码中使用了该插值类型,但链接的库文件(如提供的`gsl.lib`或`gsl.dll`)没有包含此符号,导致链接器找不到定义。这可能是因为编译GSL库时未正确配置,或者用户下载的预编译库版本较旧。 解决方案可能包括: - 更新GSL到最新版本,确保支持该插值类型。 - 检查链接的库文件是否正确,是否包含所需的符号。 - 在代码中验证插值类型名称是否正确,是否存在拼写错误。 - 在Visual Studio项目中确保库路径和附加依赖项设置正确。 同时,用户提供的优快云链接中的库可能存在问题,建议用户从官方渠道获取GSL库,或者自行编译确保所有功能都被包含。 最后,可能需要指导用户如何检查GSL库中的符号是否存在,例如使用工具如`nm`(Linux)或`dumpbin`(Windows)来查看库文件中的导出符号,确认是否存在`_gsl_interp_cspline_periodic`。</think>### 问题分析:`Undefined symbol _gsl_interp_cspline_periodic` 该错误表明编译器在链接阶段未找到`gsl_interp_cspline_periodic`符号的定义。可能原因如下: 1. **GSL版本过低** `gsl_interp_cspline_periodic`是周期性三次样条插值类型的标识符,在较旧的GSL版本中可能未包含此功能。例如,GSL 2.5及以上版本明确支持周期性样条插值[^1]。 2. **链接库不完整** 编译时未正确链接GSL的动态库或静态库。在Visual Studio中需确保项目属性中配置了库路径(如`gsl.lib`、`gslcblas.lib`)和头文件路径[^2]。 3. **预编译库的兼容性问题** 引用的预编译GSL库(如优快云提供的版本)可能未启用周期性样条插值选项,或与当前开发环境(如运行时库版本MD/MDd)不兼容[^2]。 --- ### 解决方案步骤 #### 1. 验证GSL版本 检查当前GSL版本是否≥2.5: ```c #include <gsl/gsl_version.h> printf("GSL version: %s\n", gsl_version); ``` 若版本过低,需升级GSL库: - **Windows**:从[GSL官方GitHub](https://github.com/gnu-octave/gsl)下载最新源码并重新编译。 - **Linux**:使用包管理器更新(如`sudo apt-get install libgsl-dev`)。 #### 2. 检查链接配置(Visual Studio) - **附加包含目录**:添加GSL头文件路径(如`C:\gsl\include`)。 - **附加库目录**:添加GSL库文件路径(如`C:\gsl\lib`)。 - **附加依赖项**:添加`gsl.lib;gslcblas.lib`。 具体配置步骤可参考引用[2]中的编译方法。 #### 3. 替换为官方预编译库 若问题仍存在,建议使用官方提供的Windows预编译库(如[MSYS2](https://packages.msys2.org/package/mingw-w64-x86_64-gsl))代替第三方编译版本,避免兼容性问题。 --- ### 代码示例:正确使用周期性样条插值 ```c #include <gsl/gsl_interp.h> #include <gsl/gsl_spline.h> int main() { const gsl_interp_type *interp_type = gsl_interp_cspline_periodic; // 确保版本支持 gsl_interp *interp = gsl_interp_alloc(interp_type, 10); // 分配插值对象 // ... 其他操作 gsl_interp_free(interp); return 0; } ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值