【解决问题】【 error: ‘/usr/lib/x86_64-linux-gnu/libGL.so‘】【库的链接】【工具apt-file-用来解决linux 下任何 lib 文件缺失】

【解决问题】【 error: '/usr/lib/x86_64-linux-gnu/libGL.so'】

  • 0 前言
  • 1 问题描述
  • 2 解决方案
  • 3 额外收获
    • 3.1 库的链接建立及查看
      • 3.1.1 库的链接建立
      • 3.1.2 库的链接查看
    • 3.2 工具apt-file,查看可以用来解决linux 下任何 lib 文件缺失的情况
      • 3.2.1 工具apt-file安装
      • 3.2.2 使用示例
  • 4参考文章

0 前言

  • 这个问题是我在slam14讲的第十二讲的RGBD稠密建图中使用pcl的时候报错的
  • 系统配置:ubuntu18.06

1 问题描述

  • 在编译工程的时候报错error: '/usr/lib/x86_64-linux-gnu/libGL.so',最终确定是由于系统中缺少libGL.so
  • 这是由于动态库链接中断造成的,我们在相应的文件目录下看看该文件的状态
cd /usr/lib/x86_64-linux-gnu/
  • 有好些解决方法是基于该目录下存在libGL.so这个文件的,如参考文章3
  • 而我遇到的情况是该文件夹下没有libGL.so,只有libGL.so.1libGL.so.1.0.0这两个文件,类似于参考文章2

2 解决方案

  1. 首先确定自己安装了libGL
sudo apt-get install build-essential libgl1-mesa-dev

sudo apt-get install freeglut3-dev

sudo apt-get install libglew-dev libsdl2-dev libsdl2-image-dev libglm-dev libfreetype6-dev

虽然就算安装了可能也并不能解决问题

  1. 然后在整个电脑中查找libGL.so,如果查找到了就好办了,把这个libGL.so复制到/usr/lib/x86_64-linux-gnu/路径下,命令为
sudo cp xxx/libGL.so /usr/lib/x86_64-linux-gnu/libGL.so

但是,这里我整个电脑都没有找到,所以我把libGL.so.1复制一份为了libGL.so

sudo cp /usr/lib/x86_64-linux-gnu/libGL.so.1 /usr/lib/x86_64-linux-gnu/libGL.so
  1. 然后知道这是由于动态库链接中断造成的,所以我们要进行链接,首先要确定正确的libGL.so建立的是什么链接,查看一个库文件的链接方式为:(这是摘自从另一台电脑中获得的正确链接方式)
wrx@wrx:/usr/lib/x86_64-linux-gnu$ ls -l libGL.so
lrwxrwxrwx 1 root root 14 510 20:17 libGL.so -> libGL.so.1.0.0
  1. 现在有了新的libGL.so,也知道了正确的链接方式,下面进行链接
sudo ln -s  /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGL.so.1.0.0 

若提示无法创建符号链接,文件已经存在,就把已经存在的那个文件用sudo rm删掉,我就是备份后直接删掉了
直接删掉不太放心,先sudo cp备份一下
这是因为涉及到这些符号链接文件需要用绝对路径,也就是说,即使你在该目录下,也不要用./libGL.so这种方式,而是要老老实实带上/urs/lib/x86…
手动链接

  • 下面的就是一些其他的注意事项
  1. 完了之后,一方面可以右键文件属性查看是否链接成功,一方面可以ls -n /usr/lib/x86_64-linux-gnu/libGL.so 查看其链接状态,一方面可以ls该目录下的所有文件看是否有红名存在。
  2. P了个S,最好不要用自动链接,sudo ln -s /usr/lib/x86_64-linux-gnu/libGL.so省去后面的参数就是自动链接,因为这里自动链接到另外一个so文件,且链接完了之后还是红名+链接断开状态,这里是参考的别人的
  3. 然后再编译就可以了,但是这里也有疑惑,由于我是直接删除了libGL.so.1.0.0,然后建立的链接,但是使用ls -n检查发现三者之间的没有互相连接,但是三者之间存在链接
  4. 然后我使用ldd pointcloud_mapping ,查看可执行文件的链接库链接情况,发现:
libGL.so.1 => /usr/lib/x86_64-linux-gnu/libGL.so.1 (0x00007f127af3d000)

最后链接的还是libGL.so.1,emmm,迷惑,但是问题至少是这个问题解决了

3 额外收获

3.1 库的链接建立及查看

3.1.1 库的链接建立

sudo ln -s  /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGL.so.1.0.0 

3.1.2 库的链接查看

查看其链接状态

ls -n /usr/lib/x86_64-linux-gnu/libGL.so

3.2 工具apt-file,查看可以用来解决linux 下任何 lib 文件缺失的情况

3.2.1 工具apt-file安装

sudo apt-get install apt-file
sudo apt-file update

这样,就装好了该工具

3.2.2 使用示例

如果要搜索什么lib,如本文的libGL.so,则输入:

sudo apt-file search libGL.so

返回:

libgl1: /usr/lib/x86_64-linux-gnu/libGL.so.1
libgl1: /usr/lib/x86_64-linux-gnu/libGL.so.1.0.0
libglvnd-dev: /usr/lib/x86_64-linux-gnu/libGL.so
nvidia-340: /usr/lib/i386-linux-gnu/libGL.so
nvidia-340: /usr/lib/i386-linux-gnu/libGL.so.1
nvidia-340: /usr/lib/i386-linux-gnu/libGL.so.340.106
nvidia-340: /usr/lib/i386-linux-gnu/libGL.so.340.108
nvidia-340: /usr/lib/x86_64-linux-gnu/libGL.so
nvidia-340: /usr/lib/x86_64-linux-gnu/libGL.so.1
nvidia-340: /usr/lib/x86_64-linux-gnu/libGL.so.340.106
nvidia-340: /usr/lib/x86_64-linux-gnu/libGL.so.340.108
primus-libs: /usr/lib/x86_64-linux-gnu/primus/libGL.so.1
virtualbox-guest-x11: /usr/lib/virtualbox/additions/libGL.so
virtualbox-guest-x11: /usr/lib/virtualbox/additions/libGL.so.1
virtualbox-guest-x11-hwe: /usr/lib/virtualbox/additions/libGL.so
virtualbox-guest-x11-hwe: /usr/lib/virtualbox/additions/libGL.so.1

可以看到你可能是什么包缺失,然后装上就好,比如这里我当时怀疑是libglvnd-dev没装,装了以后发现还是有上面的问题,其实应该先查该so文件是否存在才对,不要像无头苍蝇。

4参考文章

  1. No rule to make target '/usr/lib/x86_64-linux-gnu/lib… .so
  2. ubuntu16.04 catkin_make报错No rule to make target ‘/usr/lib/x86_64-linux-gnu/libGL.so’
  3. make: *** 没有规则可以创建“/usr/lib/x86_64-linux-gnu/libGL.so”需要的目标“XXX”。 停止

你可能感兴趣的:(视觉SLAM14讲,linux,gnu,运维)