1.g2o链接文件找不到
error while loading shared libraries: libg2o_csparse_extension.so: cannot open shared object file: No such file or directory
解法:ldconfig即可
1.1这是一类问题,感觉提示找不到.so文件都可以尝试ldldconfig,
2.fmt没连接(unit 4)
报错:
/usr/bin/ld: pose_graph_g2o_lie_algebra.cpp:(.text._ZN3fmt2v89formatterINS0_17basic_string_viewIcEEcvE5parseINS0_26basic_format_parse_contextIcNS0_6detail13error_handlerEEEEEDTcldtfp_5beginEERT_[_ZN3fmt2v89formatterINS0_17basic_string_viewIcEEcvE5parseINS0_26basic_format_parse_contextIcNS0_6detail13error_handlerEEEEEDTcldtfp_5beginEERT_]+0x543): undefined reference to `fmt::v8::detail::error_handler::on_error(char const*)'
解决方法:下个fmt包,能apt install 最好,不然git clone。(我是git clone的),然后目标工程findpackage(fmt REQUIRED),目标文件链接fmt(target_link_library),搞定!
在cmakelists文件中,有一个对是否为ubuntu20.04的判定,判定为20.04后才会链接fmt库,直接把判定条件改为if(1),即无论如何都寻找并连接fmt库.
3.sophus库报错段错误(unit 4)
具体没看懂,看懂再说
ch4/example/trajectoryError 运行可执行文件出现错误 · Issue #110 · gaoxiang12/slambook2 · GitHub
4.g2o_viewer无法正常使用
解决高翔SLAM14讲ch11中找不到g2o_viewer命令问题_努力做学霸的学渣的博客-CSDN博客
因为安装的时候有一个插件qt5没装,而cmakelists里它也没有required,因此通过编译但没安插件。
解法:
sudo apt-get remove qt4-qmake
sudo apt-get install qt5-default qtcreator
sudo apt-get install libqglviewer-dev-qt5
4.1 error: expected primary-expression before ‘)’ token (unit 6 )
最新版g2o甚至只能用c++ 17编译,且g2o::make_unique()不存在,需要改为std::make_unique() ,可能是c++17把这个函数挪到标准库了。
解法:cmakelists中编译器改为c++17;改std::make_unique() 。
注意:墙两边的解法都是说是要linux下的编译器识别不了一些符号导致的错误,需要增加template。但事实上并没有采用这种方法就解决了问题,这个究竟是做什么的还是没搞清。
5.一个诡异的错误:ch12的mono部分报错段错误
结论
update函数是bool型,但是没有返回值,虽然warning了,但是正经人谁看warning啊,然后就没注意,结果它还报个段错误,日
过程
gdb定位到epipolarSearch(cv::Mat const&, cv::Mat const&, Sophus:--Type <RET> for more, q to quit, c to continue without paging--ret
:SE3<double, 0> const&, Eigen::Matrix<double, 2, 1, 0, 2, 1> const&, double const&, double const&, Eigen::Matrix<double, 2, 1, 0, 2, 1>&, Eigen::Matrix<double, 2, 1, 0, 2, 1>&) ()
以为是vector<eigen>没align_allocated,结果呀,哎,gdb这黑厮怎么也乱报错了,董哥说下咋回事嗷~
后面用土方法打印逼近的,然后出来了,其实好像也可以用assert的,但是不会,诶嘿~
6.c++版本更新错误
报错:error: ‘decay_t’ is not a member of ‘std’; did you mean ‘decay’? 等,都是相同格式
错误原因是用c++14规则写的代码。但是指定的编译器是c++11,所以报错
报错:error: ‘slots_reference’ was not declared in this scope
各种not declare,都是需要设置编译器
解法:set(CMAKE_CXX_STANDARD 14)
ch7:引用g2o库的文件报ceres库错误
报错:/usr/bin/ld: CMakeFiles/pose_estimation_3d2d.dir/pose_estimation_3d2d.cpp.o: in function `ceres::internal::FixedArray<double, 6ul, std::allocator<double> >::operator[](unsigned long)':
/usr/local/include/ceres/internal/fixed_array.h:214: undefined reference to `google::LogMessageFatal::LogMessageFatal(char const*, int, google::CheckOpString const&)'
/usr/bin/ld: /usr/local/include/ceres/internal/fixed_array.h:214: undefined reference to `google::LogMessage::stream()'
解法:执行文件链接个glog库,没有库就安装一个,如下:
安装:
git clone https://github.com/google/glog
cd glog/cmake/
cmake .. sudo
make install
链接:
find_package(glog REQUIRED)
target_link_library(xx glog)
ch7:莫名段错误
在运行p_3d3d时,报错double free or corruption (out);
p_3d2d的optimizer.optimize()报段错误,不知道哪里内存爆了。
初步排查判定3d3d是因为bundleadjustment函数中变量二次析构了,但是具体解决方案未知
解法:未知