0. 环境描述
· 编译环境:Ubuntu20.04 + ROS-noetic
· 运行工程:GVINS,香港科技大学开源项目
1. 问题描述
编译GVINS工程时出现opencv冲突警告,但能够顺利编译通过,roslaunch运行时出现问题
roslaunch gvins visensor_f9p.launch
process[gvins_feature_tracker-1]: started with pid [17467]
process[gvins-2]: started with pid [17468]
ERROR: flag 'logtostderr' was defined more than once (in files 'src/logging.cc' and '**/glog/src/logging.cc').
[gvins-2] process has died [pid 17468, exit code 1, cmd /home/zxq/Documents/24GVINS/catkin_ws/devel/lib/gvins/gvins __name:=gvins __log:=/home/zxq/.ros/log/5ce7fbfa-da9f-11ee-8edd-2974629c888e/gvins-2.log].
log file: /home/zxq/.ros/log/5ce7fbfa-da9f-11ee-8edd-2974629c888e/gvins-2*.log
2. 排查过程
经过问题搜索可知,是程序使用到了不同的GLOG库,所以造成了冲突。
通过动态库依赖查命令:ldd进行库依赖排查
GVINS自己生成的动态链接库有libgnss_comm.so;libgvins_camera_model.so
查看glog相关依赖:
ldd libgnss_comm.so | grep libglog
libglog.so.1 => /usr/local/lib/libglog.so.1 (0x00007f3e4a1ca000)
ldd libgvins_camera_model.so | grep libglog
libglog.so.0 => /lib/x86_64-linux-gnu/libglog.so.0 (0x00007fb5d0467000)
发现两者确实用到不同的GLOG库
分析是之前源码安装的GLOG库没有删干净,还存在usr/local/lib下,代码通过FindGlog.cmake文件会优先调用源码安装的GLOG库,而ROS又会调用apt-get安装的GLOG库,在lib/x86_64-linux-gnu下,所以出现冲突。
2.1解决方案
解决方案有两种:
- 删除FindGlog.cmake文件或在cmakelist文件中指定GLOG库路径
- 删除usr/local/lib/libglog.so