0. 简介

作为ubuntu的使用者,最难过的事情就是环境的依赖和配置,其中最繁琐的就是各种动态链接库的配置。尤其是在跑ROS-SLAM等比较大的环境时候,我们会发现按照教程经常会出现安装了这个库但是在编译时爆出缺库等问题,而这些问题一般很难或者说无从查起。这种问题一般是动态链接库连接的问题,博主在经过不断地学习过后,逐渐总结了一些学习使用的技巧。这里就给各位和我拥有同样烦恼的各位读者来列举并学习一下。希望这个博客能给各位这这方面存在困扰的同学提供一些帮助。值得一提的是,我们在尝试着通过静态编译方法将SLAM算法塞到嵌入式开发板中的时候,这部分操作的学习是至关重要的。

1. ln -s xxx.so

ln的链接分软链接和硬链接两种:

  1. 软链接就是:“ln –s 源文件 目标文件”,只会在选定的位置上生成一个文件的镜像,不会占用磁盘空间,类似与windows的快捷方式。
  2. 硬链接ln 源文件 目标文件,没有参数-s, 会在选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
    sudo ln -s  /usr/lib/x86_64-linux-gnu/libboost_iostreams.so.1.65.1 /usr/lib/x86_64-linux-gnu/libboost_iostreams.so.1.57.0
    
    在这里插入图片描述

有创建就有删除,删除软连接的指令是

rm -rf symbolic_name #注意不是rm -rf symbolic_name/

软链接
1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式

2.软链接可以 跨文件系统 ,硬链接不可以

3.软链接可以对一个不存在的文件名进行链接

4.软链接可以对目录进行链接

硬链接
1.硬链接,以文件副本的形式存在。但不占用实际空间。

2.不允许给目录创建硬链接

3.硬链接只有在同一个文件系统中才能创建

2. ldd

ldd查询软连接,然后逐层查找讲这些打包即可(或者ls -il一般系统与系统直接需要tar打包传输,否则会丢失软连接)
在这里插入图片描述

3. ll -h& ls -l

动态搜索so的动态软链接
在这里插入图片描述

4. LD_LIBRARY_PATH

通过export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/UDISK/libopencv/将文档路径连接到全局路径下.

程序编译时候需要动态链接库和头文件,当编译完成后只需要动态链接库,动态链接库可以放在可执行文件下,或者在bashrc中设置export来全局设置动态链接库位置
在这里插入图片描述

5. locate

locate xxx ,来看安装的程序的路径
在这里插入图片描述

6. 拷贝ldd 的查询结果到指定目录

ldd groundSegment | awk '{print $3}' | xargs -i cp -L {} ./lib

7. 打包程序

有的时候我们需要将程序移植到没有对应环境的设备中,这时就需要我们自己复制所依赖的库。这里提供一个脚本,复制依赖库,复制以下代码,将其保存成为 copylib.sh

#!/bin/sh
bin=$1         #发布的程序名称  

desDir="./lib" #你的路径  

if [ ! -d $desDir ];then
      #echo "makedir $desDir"
      mkdir $desDir
fi 
libList=$(ldd $bin | awk  '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $libList $desDir

命令行 运行

chmod a+x ./copylib.sh
./copylib.sh ./myapp

就可以复制所需要的库到当前目录下的 ./lib 文件夹中通常情况下, copylib.sh 可以解决Linux 下程序的库依赖问题

参考链接

https://blog.csdn.net/hxxjxw/article/details/108590553