G2O版本导致的segmentation fault
1.起因
在用UBUNTU18.04的时候,cmake及make的过程是一切正常的,但是运行生成的可执行文件时,系统提示segmentation fault(core dumped),也即段错误。看完网上的解决方案,却又无从下手。跟师兄交流,很可能是不同版本的g2o边和节点定义和求解器初始化时不同的,从而造成错误。后来经过测试,一个个测试CMakeLsts.txt当中链接的源文件,确定问题出在引用g2o库(g2o版本为:20170730)上,进一步锁定在语句:
g2o::EdgeSE3Expmap *pose_e = new g2o::EdgeSE3Expmap();
2.尝试利用ADD_DEFINITIONS以及cmake时添加参数解决问题
由于g2o本身不便于调节图优化过程中的参数,因此工程中已经引入了ceres库,可以注释掉g2o相关代码。(更换g2o版本或者尝试其他声明方式应该也可以解决问题,但是由于目前基本不需要g2o库,所我并没有尝试)此处我本来想采用ADD_DEFINITIONS并在cmake的时候控制参数,然而没有成功(还需要学习cmake practice再确定)。只能在引用g2o的头文件中设置参数不编译g2o相关代码:
CMakeLists.txt中添加G2O_ON参数
在引用g2o的头文件中设置G2O_ON=0
文件中涉及到g2o的代码形式:
虽然这种方式在此处多次一举,但给我以启示,以后可以利用宏定义控制代码结构