记录一下在运行ch6程序时的报错问题:
报错如下:
/usr/local/include/g2o/core/matrix_structure.h:58:19: error: ‘std::string_view’ has not been declared
58 | bool write(std::string_view filename) const;
| ^~~~~~~~~~~
/home/zwm/slambook2/ch6/g2oCurveFitting.cpp: In member function ‘virtual bool CurveFittingVertex::read(std::istream&)’:
/home/zwm/slambook2/ch6/g2oCurveFitting.cpp:34:35: warning: no return statement in function returning non-void [-Wreturn-type]
34 | virtual bool read(istream &in) {}
| ^
/home/zwm/slambook2/ch6/g2oCurveFitting.cpp: In member function ‘virtual bool CurveFittingVertex::write(std::ostream&) const’:
/home/zwm/slambook2/ch6/g2oCurveFitting.cpp:36:43: warning: no return statement in function returning non-void [-Wreturn-type]
36 | virtual bool write(ostream &out) const {}
| ^
/home/zwm/slambook2/ch6/g2oCurveFitting.cpp: In member function ‘virtual bool CurveFittingEdge::read(std::istream&)’:
/home/zwm/slambook2/ch6/g2oCurveFitting.cpp:63:35: warning: no return statement in function returning non-void [-Wreturn-type]
63 | virtual bool read(istream &in) {}
| ^
/home/zwm/slambook2/ch6/g2oCurveFitting.cpp: In member function ‘virtual bool CurveFittingEdge::write(std::ostream&) const’:
/home/zwm/slambook2/ch6/g2oCurveFitting.cpp:65:43: warning: no return statement in function returning non-void [-Wreturn-type]
65 | virtual bool write(ostream &out) const {}
| ^
make[2]: *** [CMakeFiles/g2oCurveFitting.dir/build.make:63:CMakeFiles/g2oCurveFitting.dir/g2oCurveFitting.cpp.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:80:CMakeFiles/g2oCurveFitting.dir/all] 错误 2
make: *** [Makefile:84:all] 错误 2
错误原因:
这个错误通常是由于编译器不支持 C++17 标准或者编译器选项没有正确设置导致的。
std::string_view 是 C++17 中引入的一种轻量级的字符串类型,用于表示不拥有字符序列的字符串,它通常被用于参数传递和字符串操作中,可以有效地减少内存分配和拷贝操作。
解决方案:
①修改c++标准,这里可以参考(理论上是可以的,但是不知道为什么这里我没有成功)
https://blog.csdn.net/jianjianshini/article/details/127888460?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168069218816800180671233%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=168069218816800180671233&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-127888460-null-null.blog_rank_default&utm_term=std&spm=1018.2226.3001.4450
②把std::string_view换成std::string
因为std::string_view 通常用于在不需要对字符串进行修改的情况下对字符串进行操作,并且它可以提高程序的性能。而 std::string 则适用于需要对字符串进行修改或者需要将字符串传递给需要拥有字符串的所有权的函数时,这里好像用后者也行。
具体改动如下:
在/usr/local/include/g2o/core/matrix_structure.h中
首先加入
#include <string>
其次把
bool write(std::string_view filename) const;
改成
bool write(std::string filename) const;
运行如下:
~/slambook2/ch6/build$ ./g2oCurveFitting
start optimization
iteration= 0 chi2= 376795.438690 time= 2.7055e-05 cumTime= 2.7055e-05 edges= 100 schur= 0 lambda= 21.496593 levenbergIter= 1
iteration= 1 chi2= 35680.668987 time= 1.7857e-05 cumTime= 4.4912e-05 edges= 100 schur= 0 lambda= 10.024449 levenbergIter= 1
iteration= 2 chi2= 2199.597326 time= 1.7095e-05 cumTime= 6.2007e-05 edges= 100 schur= 0 lambda= 3.341483 levenbergIter= 1
iteration= 3 chi2= 178.624646 time= 1.7586e-05 cumTime= 7.9593e-05 edges= 100 schur= 0 lambda= 1.113828 levenbergIter= 1
iteration= 4 chi2= 103.241076 time= 1.7177e-05 cumTime= 9.677e-05 edges= 100 schur= 0 lambda= 0.371276 levenbergIter= 1
iteration= 5 chi2= 101.938412 time= 1.8229e-05 cumTime= 0.000114999 edges= 100 schur= 0 lambda= 0.123759 levenbergIter= 1
iteration= 6 chi2= 101.937020 time= 1.7855e-05 cumTime= 0.000132854 edges= 100 schur= 0 lambda= 0.082506 levenbergIter= 1
iteration= 7 chi2= 101.937020 time= 1.7241e-05 cumTime= 0.000150095 edges= 100 schur= 0 lambda= 0.055004 levenbergIter= 1
iteration= 8 chi2= 101.937020 time= 1.7336e-05 cumTime= 0.000167431 edges= 100 schur= 0 lambda= 0.036669 levenbergIter= 1
iteration= 9 chi2= 101.937020 time= 1.6944e-05 cumTime= 0.000184375 edges= 100 schur= 0 lambda= 0.024446 levenbergIter= 1
solve time cost = 0.000580655 seconds.
estimated model: 0.890912 2.1719 0.943629