【Ubuntu20.04】ROS noetic的g2o与系统g2o冲突问题

0.问题描述

\qquad 从github安装2023版本的g2o时,若ROS也安装了g2o,则会在编译时触发运行时冲突。具体表现为段错误,如若需要排查是否为ROS的g2o导致,则需要在C++编译时加上flags "-g -fsanitize=address"。还有一种办法是查看可执行文件链接的库是否包含ros版本的g2o,具体操作为ldd xxx/xxx.so | grep -i g2o,若查找到/opt/ros/noetic/lib/libg2o_xxx等字样则可归为此类问题。
在这里插入图片描述

1.问题原因

gedit ~/.bashrc,查看是否包含命令source /opt/ros/noetic/setup.bash
如若包含,再次在终端检查LD_LIBRARY_PATH环境变量是否包含ROS的PATH:

printenv LD_LIBRARY_PATH

如若包含/opt/ros/noetic/lib,则是ROS的shell命令修改环境变量所致。

2.解决方法

2.1.方法1

根据上述的分析,解决问题的方案很简单,只需要在编译工程的终端加入

export LD_LIBRARY_PATH=""

使得全局查找library的时候避免ROS即可。如果LD_LIBRARY_PATH还有工程需要的路径,也可以赋其他值。

2.1.方法2

在CMakeLists.txt中加入shell命令,使得工程具有通用性:

execute_process(COMMAND export LD_LIBRARY_PATH="")

友情提示,重编译时请删除build文件夹即所有动态链接库缓存,否则会从CMakeCache.txt中直接调用g2o的路径。编译完成后使用ldd命令再次检查可执行文件是否包含正确的g2o库,如若通过github的g2o按照,应该链接到/usr/local/lib/g2o下的g2o动态链接库。
这个方法是别的博客上借鉴的,但是亲测没有用处,因为CMake的环境变量和终端的不一样!可以使用cmake -E environment | grep -i LD_LIBRARY_PATH检查。

3.成功效果

通过ldd xxx | grep -i g2o查看链接库时成功链接至自己安装的路径。需要注意,整个安装过程,请不要打开新的终端,以免造成环境变量污染。 (可以打开别的终端。但需要特别注意调试的时候,需要在自动打开的调试终端进行方法1操作,但是不需要使用CMake重新编译)
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非线性光学元件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值