cartographer編譯過程遇到未定義的dlclose@@GLIBC_2.2.5

1. 使用的安裝過程如下:

先裝下這下面幾個依賴
sudo apt-get update
sudo apt-get install -y python-wstool python-rosdep ninja-build

1. cartographer,cartographer_ros,ceres-solver放在工作空間的src目錄下

2. protobuf放在工作空間下

3. 編譯指令:catkin_make_isolated --install --use-ninja

一些相關的以來安裝完成後,進行了lua的安裝, 下載lua,我的版本是3.5,基本上就是按照官網的教程(在下載後的doc文件夾)

//編譯生成linux版本
cd lua-5.3.0
make linux 
//安裝
sudo make install
//測試是否安裝成功
make test
//如果可以輸出lua的版本,即表示安裝成功;

接下來用catkin_make_isolated 進行carto的編譯,但是編譯時遇到問題如下:
 

/usr/bin/ld: /usr/local/lib/liblua.a(loadlib.o): undefined reference to symbol 'dlclose@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libdl.so.2: error adding symbols: DSO missing from command line​

從報的錯誤上直接分析就是carto用到了lua.a的靜態庫,但是lua.a中的dlclose沒有找到,同時libdl.so.2遇到了DSO missing的問題;

更細節的DSO missing原因我不清楚,但是一般這種錯誤就是庫的鏈接出了問題;

我檢查了自己電腦上的libdl.so文件,發現幾個地方如下:

/usr/lib/x86_64-linux-gnu/libdl.so
//lib/x86_64-linux-gnu/libdl.so.2
//lib/x86_64-linux-gnu/libdl-2.23.so

carto在編譯的過程中找到的是第二個路徑,接下來嘗試了幾種方法都是錯誤的,翻到最後可以直接查看正確的修改;

1. 嘗試建立軟連接,最開始沒有找到libdl.so.2, 於是在/usr/lib/x86_64-linux-gnu/ 下用ln -s 建立了一個新的鏈接libdl.so.2;但事實證明這種方法是錯誤的,因爲carto根本不會找到這個文件;

2.嘗試在編譯lua的時候人爲地添加libdl;

make linux MYLIBS=/usr/lib/x86_64-linux-gnu/libdl.so

按照lua的官網講解,可以通過MYLIBS添加自己想添加的庫,這樣編譯後確實也添加成功了,但是再次運行carto還是會報同樣的錯誤;

3. 正確答案:參照了網站https://github.com/awesomeWM/awesome/issues/1664中psychon的回答:

我不太清楚他們跑的awesome是什麼PROJECT,但是遇到的問題大概類似,在答案中有這樣一種解釋:

The problem is due to:

  • Static libraries do not carry dependency information
  • CMake's FindLua does not detect a statically built Lua depending on libdl.

I have searched around for this issue and it did come up once in #361 so I tried running CMAKE_ARGS="-DLUA_LIBRARY=/usr/local/lib/liblua.a;dl" make but then I get:

Try -DLUA_LIBRARY=/usr/local/lib/liblua.a\;/usr/lib/libdl.so, assuming that is the path to your libdl.

我的理解是靜態庫並不會帶着自己的依賴項過來,而CMAKELISTS中的findpackage找到的lua的庫並不會帶着關於lindl.so.2的鏈接;所以在編譯carto的時候系統會隨機地找對應的依賴項,這樣就找到了//lib/下的libdl.so.2;

理解不知道正確與否,按照這個解釋,其實是需要我們自己認爲指定一下libdl.so的路徑的,他給出的答案-DLUA_LIBRARY使用於命令行安裝,但是我們這裏需要的是修改CMAKELIST

於是,找到src/cartographer下的CMakelists.txt文件,在find_package(LuaGoogle REQUIRED)後面添加

set(LUA_LIBRARIES "/usr/local/lib/liblua.a;/usr/lib/x86_64-linux-gnu/libdl.so")

因爲後面target_link_libraries() 中使用到的都是LUA_LIBRARIES,因此,這樣相當於人爲地將libdl.so添加到可執行文件的生成過程;

至此,carto就可以編譯成功;

有問題歡迎留言交流 :)附上:libdl.so的基本使用的小結

只需要記住一個頭文件,和四個函數即可:
頭文件:#include <dlfcn.h>

四個函數:
dlopen//打開一個動態庫
dlsym//在打開的動態庫裏找一個函數
dlclose//關閉動態庫
dlerror//返回錯誤
來自:https://blog.csdn.net/hjd_love_zzt/article/details/18950351

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章