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

 

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