g2o重复编译导致的undefined symbol问题

源码编译g2o未安装后

编译slambook/ch7后运行程序报错:

./build/pose_estimation_3d3d: symbol lookup error: ./build/pose_estimation_3d3d: undefined symbol: _ZN3g2o32OptimizationAlgorithmGaussNewtonC1EPNS_6SolverE

原因在于可执行程序链接的g2o库有问题,查看可执行文件的链接库

ldd pose_estimation_3d3d

输出为:

linux-vdso.so.1 (0x00007ffe0f1d6000)
libg2o_core.so => /opt/ros/melodic/lib/libg2o_core.so (0x00007f2cec21e000)
libg2o_stuff.so => /opt/ros/melodic/lib/libg2o_stuff.so (0x00007f2cec001000)
libg2o_types_sba.so => /opt/ros/melodic/lib/libg2o_types_sba.so (0x00007f2cebdad000)
libopencv_features2d.so.3.2 => /usr/lib/x86_64-linux-gnu/libopencv_features2d.so.3.2 (0x00007f2cebaf8000)

在装有ros的ubuntu环境下,单独编译g2o时由于ros内置了g2o库,编译后的库文件指向都是ros的内置库而非g2o源码编译的库,可以通过ldd libg2o_core.so查看该库是否链接到了ros的内置g2o库

打开.bashrc文件,注释掉ros的环境变量

source .bashrc 更新环境变量

重新编译g2o的源码,此时生成的库用ldd libg2o_core.so查看链接正确

linux-vdso.so.1 (0x00007ffcfbffa000)
libg2o_stuff.so (0x00007febe4f37000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007febe4bae000)

编译完后取消.bashrc内ros的注释并source .bashrc

在CMakeLists.txt中

target_link_libraries( pose_estimation_3d3d 后添加对应g2o库的绝对路径或相对路径即可

参考链接:

ubuntu16.04下g2o链接错误问题解决办法 错误代码:undefined symbol: _ZN3g2o32OptimizationAlgorithmGaussNewtonC1ESt10uni_mclinRV的博客-CSDN博客

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值