视觉slam十四讲-第6讲非线性优化篇踩坑


视觉slam十四讲-第6讲非线性优化篇踩坑

为了以后方便,我利用ROS-kinetic实践《视觉slam十四讲》中的程序,其中在6.3节Ceres实践篇中,遇到了一个坑,搞了一下午才搞出来。在按照书中内容编写好程序及库依赖后,编译程序,出现了下面的错误 :

undefined reference to symbol ‘pthread_rwlock_wrlock@@GLIBC_2.2.5’
这个搞了一下午,查到很多方法都集中再一点上,libpthread.a这个库没有引用好。但是每个方法试过后都不管用,直到我重新检查我的CMakeLists文件后才发现问题,这里是ceres库没有引用好,格式出错了。正确的格式为:
find_package(Ceres REQUIRED) include_directories(${CERES_INCLUDE_DIRS}) add_executable(ceresCurveFitting ceresCurveFitting.cpp) target_link_libraries(ceresCurveFitting ${OpenCV_LIBS} ${CERES_LIBRARIES})

之前我一直把ceres大小写搞错了,真尴尬。不过在修改前,我也先用网上的方法自查了一遍libpthread.a中pthread_rwlock_wrlock()函数,后来发现这个真没有,查看pthread_rwlock_wrlock()方法为:
man -k pthread_rwlock_wrlock

添加方法为:
sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev

编译后有可能出现chrono库里的函数没有声明的错误,这里主要是c++的引用标准出现错误,可以在CMakeLists文件中加入一句话:
set(CMAKE_CXX_FLAGS "-std=c++11")

【视觉slam十四讲-第6讲非线性优化篇踩坑】最后,用ROS编写《视觉slam十四讲》中的程序,其实在main函数中直接写就可以了,相当于写一个普通的c++程序,之后再用ROS编译。

    推荐阅读