1 为什么会遇到这个问题
我们在
2 查看问题所在
我的项目依赖于VTK 7.1.1,PCL 1.9.1。项目可以完成编译,但是不能执行。即使用动态库编译链接stereo_inertial_tum_vi_old.cc后,得到名为stereo_inertial_tum_vi_old的可执行程序。但是在运行stereo_inertial_tum_vi_old可执行程序时,程序报错。问题如下:
但是我们寻找一下这个动态链接库:
sudo updatedb locate libvtkCommonMisc-7.1.so.1
我们发现是有这个库文件的。
首先利用ldd命令查看一下stereo_inertial_tum_vi_old的动态库依赖关系:
结果如下图所示,可以看到,动态库libvtk很多都没有被找到。
至于找不到的情况分为两种:
- 系统里根本不存在这些库;
- 这些库在系统中存在,但是ld-linux.so找不到,即libxxx.so库的位置没有告知ld-linux.so。
由于动态库是自己刚刚创建好的,因此属于第二种情况。
我们知道,只要把动态库libvtk*.so的绝对路径添加到动态载入器ld-linux.so的搜索路径中,那么动态载入器就可以获取到动态库libcalc.so的绝对路径,接着就可以找到动态库文件libcalc.so,将动态库文件载入内存,然后就可以使用动态库里面的代码,最终可执行程序stereo_inertial_tum_vi_old就可以成功运行,不会报错。
动态载入器搜索动态库绝对路径的搜索顺序为:DT_RPATH段→环境变量LD_LIBRARY_PATH
→/etc/ld.so.cache文件列表→/lib/或/usr/lib目录因此,添加动态库绝对路径的方法也有很多种
接下来,我们就按照上述分析进行操作。
3 解决问题
3.1 将动态库绝对路径添加至环境变量LD_LIBRARY_PATH
首先进入存放动态库的文件夹内,然后输入如下命令,获取动态库libvtk*.so的绝对路径,然后复制此绝对路径。
因此我们看看缺少库的路径:
libvtkCommonMisc-7.1.so.1 => not found libudev.so.1 => /lib/x86_64-linux-gnu/libudev.so.1 (0x00007f7d166ed000) libvtkCommonTransforms-7.1.so.1 => not found libvtkCommonSystem-7.1.so.1 => not found libvtkzlib-7.1.so.1 => not found libvtksys-7.1.so.1 => not found libvtksys-7.1.so.1 => not found libvtkCommonSystem-7.1.so.1 => not found libvtkCommonTransforms-7.1.so.1 => not found libvtkDICOMParser-7.1.so.1 => not found libvtkmetaio-7.1.so.1 => not found libvtkpng-7.1.so.1 => not found libvtksys-7.1.so.1 => not found libvtktiff-7.1.so.1 => not found libvtkzlib-7.1.so.1 => not found libvtkCommonMath-7.1.so.1 => not found libvtkjpeg-7.1.so.1 => not found libvtkCommonTransforms-7.1.so.1 => not found libvtkCommonMath-7.1.so.1 => not found libvtkzlib-7.1.so.1 => not found libvtksys-7.1.so.1 => not found libvtkCommonMisc-7.1.so.1 => not found libvtkCommonTransforms-7.1.so.1 => not found libvtkCommonMisc-7.1.so.1 => not found libvtkCommonSystem-7.1.so.1 => not found libvtksys-7.1.so.1 => not found libvtkCommonMath-7.1.so.1 => not found libvtksys-7.1.so.1 => not found
应该都是在一个文件夹下面的,我们选择第一个动态链接库:
locate libvtkCommonMisc-7.1.so.1
liuhongwei@liuhongwei-Legion-Y9000P-IRX8H:~/Desktop/orb_slam3-master$ locate libvtkCommonMisc-7.1.so.1 /bag/VTK-7.1.1/build/lib/libvtkCommonMisc-7.1.so.1 /home/liuhongwei/Desktop/vtk7.1.1/lib/libvtkCommonMisc-7.1.so.1 /usr/local/lib/libvtkCommonMisc-7.1.so.1
我们进入/usr/local/lib下面:输入pwd获得当前的绝对路径:
liuhongwei@liuhongwei-Legion-Y9000P-IRX8H:/usr/local/lib$ pwd /usr/local/lib
然后输入如下命令,将动态库绝对路径添加至环境变量LD_LIBRARY_PATH中:
liuhongwei@liuhongwei-Legion-Y9000P-IRX8H:/usr/local/lib$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
输入完上述命令后,输入echo命令检查一下环境变量LD_LIBRARY_PATH的值。
echo $LD_LIBRARY_PATH
liuhongwei@liuhongwei-Legion-Y9000P-IRX8H:/usr/local/lib$ echo $LD_LIBRARY_PATH /opt/ros/melodic/lib:/usr/local/cuda-11.6/lib64:/usr/local/lib
可见动态库的绝对路径已经成功添加至环境变量LD_LIBRARY_PATH中了。
最后再使用ldd命令查看一下stereo_inertial_tum_vi_old的动态库依赖关系,如下图所示,此时动态载入器就可以获取到动态库libtk*.so的绝对路径了。接下来就可以找到动态库文件libtk*.so,然后将动态库文件载入内存,接着就可以使用动态库里面的代码,最终可执行程序stereo_inertial_tum_vi_old就可以成功运行了。
运行成功!