源码编译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库的绝对路径或相对路径即可
参考链接: