下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此
下面是专栏地址:
这个系列的文章是分享SLAM相关技术算法的学习和工程实践
安装参考:
ubuntu18.04 安装ceres,g2o,以及cmake升级
g2o官网:https://openslam-org.github.io/g2o.html
github主页:https://github.com/RainerKuemmerle/g2o
源码下载
这里不用下最新版本的,因为可能会有一些BUG,安装老版本的即可,如我这里安装的是 g2o-20201223_git 版本
安装依赖
(1)必需依赖
On Ubuntu / Debian these dependencies are resolved by installing the following packages.
在装g2o的时候,对 cmake 的版本有要求,可能需要升级
查看当前cmake版本:
cmake -version
卸载当前cmake:(如果安装了ROS跳过此步)
sudo apt remove cmake
下载cmake:
可直接从cmake官网下载新版本,也可执行如下语句:
wget http://www.cmake.org/files/v3.16/cmake-3.16.6.tar.gz
我这里下载的是 cmake-3.16.6版本。
(2)可选依赖
安装命令:
sudo apt-get install libspdlog-dev libsuitesparse-dev qtdeclarative5-dev qt5-qmake libqglviewer-dev-qt5
编译并安装
cd g2o
mkdir build
cd build
sudo ldconfig # 实际安装时不写这一行也行
# cmake ..
# 注意这里官网说要用 c++17 来编译
cmake .. -DCMAKE_CXX_STANDARD=17
make -jx
sudo make install
注意,一定要在编译前进入build,进行sudo ldconfig。
ldconfig是一个动态链接库管理命令
安装完成某个工程后生成许多动态库,为了让这些动态链接库为系统所共享,还需运行动态链接库的管理命令–ldconfig。(直接sudo ldconfig即可)。
这里编译时,官网推荐选择 c++ 17 标准来编译,方法为
(1)直接使用命令
cmake .. -DCMAKE_CXX_STANDARD=17
(2)在 CMakeLists.txt 中加一行
set(CMAKE_CXX_FLAGS "-std=c++17 -O3")
g2o 库编译完成后安装
再编译时出现错误
/usr/bin/ld: /home/jin/anaconda3/lib/libQt5Core.so.5.15.2: undefined reference to `std::__exception_ptr::exception_ptr::_M_release()@CXXABI_1.3.13'
/usr/bin/ld: /home/jin/anaconda3/lib/libQt5Widgets.so.5.15.2: undefined reference to `std::__throw_bad_array_new_length()@GLIBCXX_3.4.29'
/usr/bin/ld: /home/jin/anaconda3/lib/libQt5Core.so.5.15.2: undefined reference to `std::__exception_ptr::exception_ptr::_M_addref()@CXXABI_1.3.13'
collect2: error: ld returned 1 exit status
make[2]: *** [g2o/apps/g2o_viewer/CMakeFiles/g2o_viewer.dir/build.make:101:bin/g2o_viewer] 错误 1
make[1]: *** [CMakeFiles/Makefile2:1508:g2o/apps/g2o_viewer/CMakeFiles/g2o_viewer.dir/all] 错误 2
make: *** [Makefile:152:all] 错误 2
通过undefined reference to
可以看出来是由于so库的引用问题导致的,我们通过修改一下配置文件,将/root/anaconda3/lib
添加到用户配置文件的目录下即可
参考:
安装darknet报libQt5Core.so.5: undefined reference
解决办法
在安装ROS和安装Anaconda时都会有安装qt,同时创建了两个有关于qt的cmake文件,在编译的时候选择了有一步
find_package(Qt5 REQUIRED ...)
这一步原本应该去寻找 /usr/lib/x86_64-linux-gnu/cmake/Qt5/QtConfig.cmake
这个文件
但由于安装了 anaconda 所以这一步变为了寻找 /home/${username}/Anaconda3/lib/cmake/Qt5/QtConfig.cmake
这个文件,导致后续编译时链接的库文件出错。所以报出以上错误。
限定我们要寻找的 Qt5config.cmake
文件的路径,也就是在 CMakeLists.txt 里添加
SET(CMAKE_PREFIX_PATH "/usr/lib/x86_64-linux-gnu/cmake")
重新编译即可解决问题。(如果问题没有得到解决,建议删除build文件夹下的所有内容,再次编译,即可通过)
此时再编译即可编译通过
参考:
error::make_unique is not a member of ‘std’
视觉Slam14讲第六章g2o安装报错,Ubuntu22.04
error: no matching function for call to ‘g2o #206
g2o 库编译完后,在编译主函数时会报如下错误
/home/jin/jin_ws/slambook2-master/ch6/g2oCurveFitting.cpp:91:37: error: expected primary-expression before ‘>’ token
91 | g2o::make_unique<BlockSolverType>(g2o::make_unique<LinearSolverType>()));
| ^
/home/jin/jin_ws/slambook2-master/ch6/g2oCurveFitting.cpp:91:44: error: ‘make_unique’ is not a member of ‘g2o’; did you mean ‘std::make_unique’?
91 | g2o::make_unique<BlockSolverType>(g2o::make_unique<LinearSolverType>()));
| ^~~~~~~~~~~
这里可以换成老版本的 g2o 来编译安装,如 20201223 这个版本
用老本版编译安装后,就可以正常编译main函数了