加载libGL.so.1时出错。

在尝试运行各种软件(特别是Steam和Yenka)时,我遇到了类似于以下错误的问题:error while loading shared libraries: libGL.so.1: cannot open shared object file: No such file or directory

我正在运行一个64位系统,拥有一张NVidia Optimus显卡(我双启动以使用某些仅支持专用显卡的Windows软件)。我已经安装了bumblebee,并且正在使用nvidia-current驱动程序,而不是从NVidia下载的驱动程序,这是推荐的配置。

该库(libGL.so.1)不存在于/usr/lib的顶级目录中,但它作为指向/usr/lib32/nvidia-current/libGL.so.304.64的软链接存在于/usr/lib32/nvidia-current中。

ldconfig -p的部分输出:

libGL.so.1 (libc6,x86-64, OS ABI: Linux 2.4.20) => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
libGL.so (libc6,x86-64, OS ABI: Linux 2.4.20) => /usr/lib/x86_64-linux-gnu/libGL.so
libGL.so (libc6,x86-64, OS ABI: Linux 2.4.20) => /usr/lib/x86_64-linux-gnu/mesa/libGL.so

显然,正在加载带有该名称的库,但它们位于"/usr/lib/x86_64-linux-gnu"目录下,然而安装的软件似乎无法“看到”它。对于Steam来说,使用optirun运行可以使其正常工作,但对于Yenka来说则不是这样。我猜想optirun会导致存储在"/usr/lib32/nvidia-current"目录下的库被使用,这使得Steam可以运行,所以我无法理解为什么Yenka无法运行。
有人能解释一下为什么软件看不到正常的mesa库,以及为什么Yenka拒绝使用nvidia-current库吗?
8个回答

我在安装Skype后遇到了同样的问题...所以你可以采取以下任何一种方式来解决此错误...
第一种方法是按照以下命令运行应用程序...例如,我正在运行Skype...
LD_PRELOAD=/usr/lib/i386-linux-gnu/mesa/libGL.so.1 skype

资料来源

我做了第二件事

sudo nano /etc/ld.so.conf.d/skype.conf

并在其中添加以下行

/usr/lib/i386-linux-gnu/mesa/

保存并退出

最后运行

sudo ldconfig -v

希望这能解决你的libGL.so.1错误,就像它解决了我的一样。
你也可以找到libGL.so.1。
   find / -name libGL.so.1

最后我成功修复了它。不幸的是,我记不清具体步骤了,但我记得其中包括创建随机符号链接到库文件,多次运行ldconfig命令,然后删除上述的符号链接。现在一切都正常工作。 - user58203
这个方法很好用!终于!而且,我还记得在这些步骤之前做了@jdp407说的那件事。 - Gundars Mēness
1虽然这个解决方案不错,但它只能一次处理一个应用程序。如果您还有其他需要 libGL.so 的32位应用程序,那么您将不得不为这些应用程序重复此过程。最好使用 update-alternatives 全局地设置此首选项。 - Ch4ni
@eurythmia 你也可以将它复制到/lib目录下,然后运行sudo ldconfig命令,这样它就可以全局访问了。 - Qasim
很遗憾,在xubuntu上对我来说不起作用,"错误:ld.so:对象'/usr/lib/i386-linux-gnu/mesa/libGL.so.1'不能预加载(无法打开共享对象文件):被忽略";skype.conf在etc/dbus-1/system.d而不是/ld.so.conf.d/,并且看起来是不同的文件... - dez93_2000
如果问题没有解决,你能否请发送屏幕截图至 o8qmjd6uf71uw6a61s93@gmail.com,以便我们修复该问题。 - Qasim
在使用NVIDIA安装程序(从nvidia网站)安装驱动程序时,当提示显示时,请选择安装32位兼容性驱动程序。这对我解决了问题。 - Che Jami
@CheJami 太好了。 - Qasim

安装了NVIDIA驱动程序后,Skype会寻找NVIDIA软件包提供的i386库。由于该库不存在,可以使用mesa提供的i386 libGL.so.1。
在测试过(raring版本的ubuntu-gnome,使用nvidia-325)和(saucy版本的ubuntu-gnome,使用nvidia-319)之后,我们通过以下方法解决了这个问题:
update-alternatives --display i386-linux-gnu_gl_conf

这将向您展示可用的选项。
i386-linux-gnu_gl_conf - auto mode
  link currently points to /usr/lib/nvidia-325/alt_ld.so.conf
/usr/lib/i386-linux-gnu/mesa/ld.so.conf - priority 500
  slave i386-linux-gnu_xorg_extra_modules: /usr/lib/i386-linux-gnu/xorg/x11-extra-modules
/usr/lib/nvidia-325/alt_ld.so.conf - priority 8602
Current 'best' version is '/usr/lib/nvidia-325/alt_ld.so.conf'

所以,按照以下步骤进行:
sudo update-alternatives --config i386-linux-gnu_gl_conf

然后选择最佳的替代方案(我选择了i386-linux-gnu/mesa/ld.so.conf): 在下面的输出中,有两个选择的替代方案i386-linux-gnu_gl_conf(提供/etc/ld.so.conf.d/i386-linux-gnu_GL.conf)。
  Selection    Path                                     Priority   Status
------------------------------------------------------------
* 0            /usr/lib/nvidia-325/alt_ld.so.conf        8602      auto mode
  1            /usr/lib/i386-linux-gnu/mesa/ld.so.conf   500       manual mode
  2            /usr/lib/nvidia-325/alt_ld.so.conf        8602      manual mode

Press enter to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib/i386-linux-gnu/mesa/ld.so.conf to provide /etc/ld.so.conf.d/i386-linux-gnu_GL.conf (i386-linux-gnu_gl_conf) in manual mode

完成后,请尝试运行以下命令:
sudo ldconfig

然后你就完成了。

2我也遇到了同样的问题,这个方法完美解决了,非常感谢(Ubuntu 13.10)。 - Xtremesupremacy3
很烦人 - 我只有ld.so.conf选项,所以得到的是“在链接组i386-linux-gnu_gl_conf中只有一个备选项(提供/etc/ld.so.conf.d/i386-linux-gnu_GL.conf):/usr/lib/i386-linux-gnu/mesa/ld.so.conf。没有需要配置的内容。” - dez93_2000
你安装了哪些NVIDIA软件包?你安装了libgl1-mesa-glx吗?在Trusty版本中,libgl1-mesa-glx:i386提供了/usr/lib/i386-linux-gnu/mesa/ld.so.conf(以及相关的libGL.so.1*库文件)。 - Ch4ni
很棒的答案。在切换到Nvidia驱动程序后,我运行Qt程序时遇到了错误-- QOpenGLShaderProgram::uniformLocation( matrix ): shader program is not linked[xcb] This is most likely caused by a broken X extension library -- 而按照这个方法解决了问题。 - Matthew Read
谢谢。它在14.04上也可以使用。这不会影响任何其他程序。对吗?就像修复一件事会破坏10个其他事情一样。 - Sudhir Singh Khanger
已确认在Ubuntu 15.10上可正常运行。 - Eduard Luca

这里的修复方法可以解决问题,但有一个更简单的方法。
如果 skype 无法工作,但 optirun skype 可以工作,则可以使用以下方法进行修复:
sudo apt-get install bumblebee-nvidia --reinstall

(使用AMD显卡的用户可能需要进行等效的重新安装)。
Bumblebee既引起又修复了这个问题,但它所应用的修复措施发生在安装过程中,当它将libGL库同时提供给集成显卡和更强大的显卡时。如果在安装Bumblebee时这些库尚未安装,则不会发生这种情况,因此需要重新安装。这不应该影响您的Bumblebee配置,但在完成此操作后进行检查是值得的。

3它对我来说运行得很好...谢谢。Ubuntu GNOME 14.04 - aditia
1绝对是最简单的解决方案!我知道这肯定与安装顺序有关,因为我最近重新安装了系统两次(Ubuntu 14.04 64位 + Nvidia Optimus显卡)。第一次我先安装了Skype,然后再安装Bumblebee,这样就没有任何问题。第二次我先安装了Bumblebee,然后再安装Skype,结果出现了这个问题。按照这个答案所示,只需重新安装bumblebee-nvidia就解决了问题! - Sicco
我倾向于同意这似乎是一个比我的解决方案更好的选择。 - Ch4ni

编辑桌面入口:

sudo nano /usr/share/applications/skype.desktop

将Exec更改为:
Exec=env PULSE_LATENCY_MSEC=60 LD_PRELOAD=/usr/lib/i386-linux-gnu/mesa/libGL.so.1 skype %U

这个运行:
LD_PRELOAD=/usr/lib/i386-linux-gnu/mesa/libGL.so.1

在使用启动器/桌面快捷方式启动Skype之前,请确保您已经运行了它。
只要您使用应用程序启动器启动它,它应该能够正常运行。

文件libGL.so.1可能不在该路径下(对我来说,在Debian 8/Jessie上并没有)。要找到您必须放入LD_PRELOAD的路径,只需在系统上找到i386文件:sudo find / -name libGL.so.1 2>/dev/null。我在/usr/lib/mesa-diverted/i386-linux-gnu/libGL.so.1中找到了它,并且使用它作为LD_PRELOAD时正常工作。 - f.ardelian

我曾遇到过类似的问题,并通过在我的64位系统上安装32位库解决了它: apt-get install ia32-libs

我不确定这是否能帮助解释清楚,但我曾经遇到过与skype和libGL.so.1相同的问题。我也在运行13.04版本的系统,并且使用优化卡和bumblebee。
当我没有使用optirun运行skype时,我会遇到这个问题,但是使用optirun运行则一切正常。我只需每次更改桌面文件以使用optirun运行,问题就解决了!

并不是真正的固定,因为您现在正在使用更耗能的卡片进行Skype通话。实际上,如果您使用VirtualGL桥而不是primus,那么您基本上会像没有安装bumblebee一样一直使用nvidia卡片,从而消耗大量电力。 - Jon Hanna

从官方的Steam页面下载最新版本,然后让它从终端下载所需内容(如果有需要的话)。如果你还没有添加Bumblebee PPA,请添加。
sudo add-apt-repository ppa:bumblebee/stable

使用以下命令更新:

sudo apt-get update

安装virtualgl(这个解决了Steam中的libgl.so.1错误问题)
sudo apt-get install virtualgl

尝试:

sudo apt-get install libgl1-mesa-glx-lts-utopic:i386