ubuntu16.04下g2o链接错误问题解决办法 错误代码:undefined symbol: _ZN3g2o32OptimizationAlgorithmGaussNewtonC1ESt10uni

问题场景

今天在复习SLAM十四讲第7章节位姿计算例子pose_estimation_3d2d时遇到了链接错误问题,具体信息如下图所示:
报错信息

问题原因分析

经过网上检索相关博客,发现是由于ROS自带的g2o版本与本地按照的版本存在冲突,这个冲突问题可以通过linux自带的ldd命令检查出来,首先检测能运行成功的例子的依赖项。下图是能正常使用的g2o示例文件的依赖项:
ubuntu16.04下g2o链接错误问题解决办法 错误代码:undefined symbol: _ZN3g2o32OptimizationAlgorithmGaussNewtonC1ESt10uni_第1张图片
ubuntu16.04下g2o链接错误问题解决办法 错误代码:undefined symbol: _ZN3g2o32OptimizationAlgorithmGaussNewtonC1ESt10uni_第2张图片
报错文件的依赖项:
ubuntu16.04下g2o链接错误问题解决办法 错误代码:undefined symbol: _ZN3g2o32OptimizationAlgorithmGaussNewtonC1ESt10uni_第3张图片
可以看到,不知何原因,这一个程序链接到了ROS自带的g2o库文件

解决方案

目前没想到很优雅的解决方式,我的方法就是将ros目录下的库文件移动到其他文件夹里,让系统检索不到它们,从而只链接到usr目录下的库文件。具体的操作步骤如下:

  1. 首先进入ros的目录下
    ubuntu16.04下g2o链接错误问题解决办法 错误代码:undefined symbol: _ZN3g2o32OptimizationAlgorithmGaussNewtonC1ESt10uni_第4张图片

  2. 打开终端,并使用管理员权限创建备份目录

  3. 在终端输入以下命令将库文件移动到备份目录下

sudo mv ./lib/libg2o*.* ./back_lib/ 

检查一下是否移动成功
ubuntu16.04下g2o链接错误问题解决办法 错误代码:undefined symbol: _ZN3g2o32OptimizationAlgorithmGaussNewtonC1ESt10uni_第5张图片

  1. 重新编译程序并检查其依赖项,可以看到程序链接到正确的库文件并正常执行

ubuntu16.04下g2o链接错误问题解决办法 错误代码:undefined symbol: _ZN3g2o32OptimizationAlgorithmGaussNewtonC1ESt10uni_第6张图片
ubuntu16.04下g2o链接错误问题解决办法 错误代码:undefined symbol: _ZN3g2o32OptimizationAlgorithmGaussNewtonC1ESt10uni_第7张图片
成功运行,收工!

你可能感兴趣的:(SLAM,自动驾驶,linux,c++)