解决本地运行SuperPoint_SLAM报错ERROR: flag 'flagfile' was defined more than once
起因
在之前本地编译了opencv-3.4.2,当时因为contrib模块需要gflags,重新下载了一个gflags在本地编译(其实本地电脑已经有这个库,但忘记为啥又去下载了一个),所以编译好的contrib(主要是sfm库)链接的就是新下载的gflags。但现在编译libtorch后,caffe2链接的是默认环境下的老的gflags,二者版本应该是不一样的,导致在运行时,各自去动态链接这两个库进来,导致了符号冲突,以下是排查过程。
使用LD_DEBUG排查链接过程
可以看到有四个target中都去查找了flagfile符号,前两个是可执行程序和superpoint_slam的库,不用管,问题应该就是出在libcaffe2.so和libopencv_sfm.so.3.4中,这两个中都有flagfile,最后报错。
用ldd查看各自链接的库
可以看到二者都有这个gflags依赖
解决办法
删除新gflags库,重新编译opencv。事后想了一下,感觉只要重新编译的opencv,是使用的默认环境中的gflags是不是也可以了。
问题解决
然后重新编译SuperPoint_SLAM,可以正常运行。
链接gflags时,也不会再报符号冲突了
但奇怪的是,重新编译opencv后,mono_kitti里也没有对opencv_sfm的依赖了,也是诡异的问题。