1. 程式人生 > 實用技巧 >G2O版本導致的segmentation fault

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的程式碼形式:

雖然這種方式在此處多次一舉,但給我以啟示,以後可以利用巨集定義控制程式碼結構