在复现FAST_LIO2时,遇到了与Sophus相关的问题,稍微搜了一下应该是链接错误的问题。然后本人之前也在opencv方面遇到类似的问题。这里做一个记录。
具体报错:
然后了解了一下undefined reference的错误
Linux动态库链接问题常见错误(/usr/bin/ld或者undefined reference to)报错_动态库 undefined reference to-优快云博客
详解error while loading shared libraries: ../../lib/libopencv_core.so-优快云博客
问题表现就是,在安装了某个库后,使用cmake去编译其他项目时,无法找到这个库。
纠错的尝试如下:
1.bashrc文件的修改
gedit ~/.bashrc
然后增加语句
修改了这个之后,没有成功,所以接着往下。(不过最后成功的时候,这一项也没有去掉,所以也不清楚这个到底重不重要)
2.重新安装Sophus
删除了原本的文件,然后进行重新的安装。因为这里是为了做FAST_LIV2的项目,所以就按照其要求进行了安装。
通过这个结果,在usr/local/include和usr/local/lib中应该正常安装好了。
-
头文件安装:
-
所有的头文件(例如
se3.h
、scso3.h
、so2.h
、so3.h
、sim3.h
、se2.h
)都被安装到了/usr/local/include/sophus
目录下。这个路径是标准的安装路径,表示你可以在代码中通过#include <sophus/se3.h>
这样的方式来引用这些头文件。
-
-
库文件安装:
-
libSophus.so
被安装到/usr/local/lib
目录下。这个文件是Sophus
的共享库文件,允许其他程序链接到Sophus
库。
-
3.通过小程序测试
自己写了一个cpp和cmakelists测试Sophus,发现问题主要出在CmakeLists中。后续根据这个思路修改了项目中的文件。
4.具体修改
在 ~/catkin_livox_ros_driver2/src/FAST-LIVO2 的CmakeLists文件中,用的是
find_package(Sophus REQUIRED)
但在我目前的情况下,手动安装的 Sophus 并没有生成 SophusConfig.cmake
,所以 find_package(Sophus REQUIRED)
会找不到。
删去上述的句子,并修改为
set(Sophus_INCLUDE_DIRS /usr/local/include)
set(Sophus_LIBRARIES /usr/local/lib/libSophus.so)
在 # Add libraries之前增加
link_directories(/usr/local/lib)
修改后重新编译,发现还有类似的报错,但是出现的位置不同。所以发现,应该是在~/catkin_livox_ros_driver2/src/rpg_vikit/vikit_common 中的CmakeLists 也需要修改。使用同样的思路修改。具体为删除了find语句,新增了两个set语句。
之后就能顺利编译成功!
5.问题总结与分析
这个是个连接错误的问题。按道理,在复现FAST_LIO2时,它提供的sophus的版本应该是正常合适的,按照其流程应该不会出这样的问题。除此之外,一些可能的影响因素:之前电脑跑过ORBSLAM,所以用其提供的代码安装过Sophus;装了ROS。所以目前的解决方法,算是不太懂为什么,但是能行的通的方法。