每次更新都出现libGl、fbConfigs和swrast的问题吗?

我在编译SFML项目时遇到了问题(看不到任何图形):

libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast

这个错误可以通过简单地按照这个教程重新安装nvidia驱动程序来解决:https://askubuntu.com/a/451248/341889 但是当我获取新的更新时,这个错误又出现了;( 我该怎么办?这不是解决方案 - 不使用系统的更新...
附言:是的,我在安装nvidia驱动程序后保存了所有更改。

1如果我尝试动态加载Mesa的libGL.so来启动一个OpenGL可执行文件,就会发生这种情况:LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/mesa ./glprogram。默认情况下,我的Ubuntu 16.04使用/usr/lib/nvidia-361/libGL.so,因为有/etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf,一切都正常运行。 - Ciro Santilli OurBigBook.com
1如果我的机器没有NVIDIA硬件,我会遇到相同的错误吗? - KcFnMi
17个回答

swrast 是软件渲染器。这意味着它没有找到您的显卡的硬件驱动程序。有一堆安装了的libGL库和一堆指向这些库的符号链接。要查看这些,请在shell中运行以下命令:
find /usr -iname "*libGL.so*" -exec ls -l -- {} + 

现在,您的问题可能是由于安装图形驱动程序时破坏了这些符号链接引起的。(具体来说,/usr/local/lib/libGL.so.1.2.0很可能是错误的库或指向错误链接的符号链接)(注意:我写这篇文章已经有一段时间了。libGL.so.1.2.0是当前的gl版本,现在可能是其他版本)。
为了确定OpenGL程序尝试运行的库,您可以打开一些详细信息并运行一个简单的OpenGL程序。您可以使用标准的OpenGL测试程序进行验证。
LIBGL_DEBUG=verbose glxgears

希望这次能像SFML一样失败。通过使用LIBGL_DEBUG,它应该告诉你它正在尝试加载哪个OpenGL库。此外,它将尝试加载的库几乎肯定是`/usr/local/lib/libGL.so.1.2.0`(编辑:这是我回答时机器上的标准OpenGL库。现在可能是其他版本)。
因此,在这种情况下的解决方案是确保`/usr/local/lib/libGL.so.1.2.0`是指向正确的OpenGL库的符号链接。在我的情况下,我使用了Nvidia 3.40驱动程序,所以我运行了以下命令:
ln -s /usr/lib/nvidia-340/libGL.so.1 /usr/local/lib/libGL.so.1.2.0

但是你会想要将它指向适合你的OpenGL库(在第一个find命令中列出)。
总结一下:安装(专有的)图形驱动程序可能会破坏用于OpenGL库的符号链接。为了解决这个问题,需要手动修复符号链接(首先修复`/usr/local/lib/libGL.so.1.2.0`)。

这个问题帮助我理解了错误信息,但并没有修复它。"重新安装NVIDIA驱动程序"的答案是一个很好的补充,因为它实际上为我解决了问题。 - henko
@henko 是的,重新安装Nvidia驱动程序可能是解决此问题最快、最简单的方法。如果由于某种原因重新安装驱动程序无法解决您的问题,需要深入研究时,请退而求其次使用这种方法。 - demented hedgehog
7我理解了每个部分,除了"almost certainly be /usr/local/lib/libGL.so.1.2.0"。我的显示是"libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/tls/swrast_dri.so libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/swrast_dri.so",而且这些文件都存在于我的系统中... - Samuel Li
我只是说这是我机器上的问题(使用最新的基于Ubuntu的操作系统)。所以在那个时候,很可能是当前的OpenGL库版本。如今,它可能已经有了其他版本,尽管我的新机器仍然指向1.2.0版本。 - demented hedgehog
1再次感谢您的解释;我对这个问题有了更好的理解。我还想指出,在我的情况下,Ubuntu的swrast.so存在一个已确认的错误,人们一直在讨论它。 - Samuel Li
哦,那很有趣。是的,这种问题可能有很多潜在原因。 - demented hedgehog
1谢谢@dementedhedgehog 这是一篇非常清晰明了的帖子,帮助我解决了我的问题(顺便说一下,我在Fedora-25上遇到的)。=:)。点赞。 - NYCeyes
非常荣幸。 - demented hedgehog

在Ubuntu 18上遇到了同样的问题。这个问题基本上只发生在32位应用程序上。所以我的想法是安装32位的Nvidia驱动,因为我的/usr/lib/i386-linux-gnu/文件夹异常地为空。
经过几次尝试后,这个方法解决了我启动Steam和Wine时的问题。
sudo apt install libnvidia-gl-418:i386

(并将418更改为您拥有的版本)
有趣的是,这些应用程序在安装过程中没有抱怨缺少依赖项。

这似乎解决了我与问题相关的一个问题,至少... - Andrew
可能是因为它是32位的原因。其他程序都能正常运行,但那些可能是64位的。尽管如此,这个程序还是能很好地工作(虽然我不得不升级版本)。 - Zoe stands with Ukraine
它可以工作!我认为你可以使用最新的libnvidia-gl-*。 - Danil
这个问题似乎已经解决了,但是几个小时后我的电脑卡住了,程序变得很慢... 请看一下这个帖子:https://askubuntu.com/questions/1298036/how-can-i-install-steam-without-having-to-uninstall-64-bit-libraries - Wilem2

我在解决如何正确设置符号链接指向nVidia驱动程序的问题时遇到了困难,最终找到了另一种适合我的方法。
具体步骤可以在这里找到。
该文档列出了通过PPA安装nVidia驱动程序的方法,提供了最新版本349.16的下载。
首先,在终端窗口中卸载当前已安装的任何nVidia驱动程序,请按下Ctrl + ALT + T组合键打开终端,然后输入以下命令。
sudo apt-get remove nvidia*

重启你的系统
然后打开另一个终端,并键入以下内容
sudo add-apt-repository ppa:xorg-edgers/ppa
sudo apt-get update
sudo apt-get install nvidia-349 nvidia-settings
sudo add-apt-repository -r ppa:xorg-edgers/ppa

然后再次重新启动
我在迷失了符号链接之后尝试了一下,安装完驱动程序后蒸汽立即正常工作,而且在我进行了400多兆字节的系统更新后仍然正常工作。

2安装驱动程序后,我不建议离开xorg-edgers ppa。更新中会有很多不稳定的软件包。 - Pilot6
只需删除nvidia*就解决了我的问题! - xtofl

我在Ubuntu 16.10上遇到了同样的问题,使用nvidia-340驱动程序,这里的解决方案都对我无效。
原来是32位库不在库路径上。
这个一行命令对我有效:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib32/nvidia-340"

我只是用这条线:
 sudo rm /usr/lib/i386-linux-gnu/libGL.so.1

而且它有效。

因为当我执行sudo ldconfig -p | grep -i gl.so时,我看到了这样的输入:

libwayland-egl.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libwayland-egl.so.1
libcogl.so.20 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcogl.so.20
libOpenGL.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libOpenGL.so.0
libOpenGL.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libOpenGL.so
libGL.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libGL.so.1
libGL.so.1 (libc6) => /usr/lib/i386-linux-gnu/libGL.so.1
libGL.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libGL.so
libEGL.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libEGL.so.1
libEGL.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libEGL.so

3人们应该遵循这意味着什么吗...? - Andrew
它能工作。但是蒸汽不再工作了。 - yevhene

为了提供一个与Adrian的答案不同的选择:如果你更喜欢使用直接从NVIDIA官方获取的专有驱动程序,而不是在PPA中找到的驱动程序,安装(或者在我的情况下,重新安装)最新的专有驱动程序可以帮助消除swrast错误。
如果你还没有NVIDIA驱动程序,请从NVIDIA官网下载驱动程序。然后,切换到tty(ctrl+alt+F1),关闭登录管理器:
如果使用lightdm,运行命令:$ sudo service lightdm stop 如果使用gdm,运行命令:$ sudo service gdm stop 进入安装脚本所在的目录并运行它,按照提示进行操作。如果预安装脚本失败,不要担心。我总是接受注册DKMS和32位兼容库。驱动程序安装完成后,重新启动机器。
$ sudo reboot

如果您已经有一份来自旧版NVIDIA驱动的安装脚本,只需按照上述所述运行NVIDIA驱动安装脚本,但使用"--update"选项:

$ sudo ./NVIDIA-Linux-x86_64-***.**.run --update

这样做将为您提供最新版本的驱动程序。
这个方法解决了我的libGL error: failed to load driver: swrast错误。

这是一个仅适用于apt的解决方案,对我有效,无需符号链接或者修改ld.so.conf.d文件:
apt install --reinstall libgl1-mesa-glx:i386
apt install mesa-utils nvidia-driver nvidia-driver-libs-i386

只需运行这个:
sudo apt-get install libnvidia-gl-(the version of your driver):i386

你的驱动程序版本显示在nvidia-settings中。

这个非常直接的解决方案对我起了作用,之前glxgears可以运行,但是steam不能。 - Remco Haszing
已经为我安装好了,但是在启动Steam时仍然出现错误。Mint 20.2。 - CoderGuy123

我必须承认,我不确定为什么这对我起作用,但它确实起了作用。在这种特殊情况下,“修复” ld.so.conf.d 条目的方法是添加一个新的条目,就像这样:
sudo ln -s /usr/lib/nvidia-381/ld.so.conf /etc/ld.so.conf.d/nvidia64.conf
sudo ldconfig 

这是有道理的,直到你运行以下的find命令为止:
$ find -L /etc/ld.so.conf.d -type f | xargs grep -i nvidia
/etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf:/usr/lib/nvidia-381
/etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf:/usr/lib32/nvidia-381
/etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf:/usr/lib/nvidia-381
/etc/ld.so.conf.d/x86_64-linux-gnu_EGL.conf:/usr/lib32/nvidia-381
/etc/ld.so.conf.d/nvidia64.conf:/usr/lib/nvidia-381
/etc/ld.so.conf.d/nvidia64.conf:/usr/lib32/nvidia-381

为什么同样的条目三份副本可以起作用,但是两份副本却不行,我真的不知道!

在Ubuntu 17.04上对我有效。只是提醒一下 - 路径是 /usr/lib/nvidia-xxx,其中 xxx 是驱动程序的编号,所以请根据实际情况调整命令。 - user2082382

在我的情况下,解决这个问题的方法就在于继续错误信息的处理。
Paraview 5.7.0 告诉我:
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
(   0.833s) [paraview] vtkOpenGLRenderWindow.c:748 ERR| vtkXOpenGLRenderWindow (0x5588ae6a2160): GLEW could not be initialized: Missing GL version
...
Segmentation fault

这条消息

GLEW could not be initialized: Missing GL version

一直以来都非常重要。我运行“glxgears”来检查图形库是否正常运行 - 请参阅man glxgears - 并显示此动画:

screenshot of glxgears

然后我的解决方案就是简单地设置环境变量。
LD_PRELOAD=/usr/lib/libGL.so

注意:
1. 尽管我有一张Nvidia显卡,但我不需要对它进行任何调整; 2. 运行locate libGL.so,我找到了另一个候选项/usr/lib/i386-linux-gnu/libGL.so。然而,将其设置为LD_PRELOAD并没有解决问题; 3. 也无需设置关于上述GLEW库的任何信息 --- 参见locate libGLEW.so 我要感谢https://github.com/openai/mujoco-py/issues/44提供的线索。

关于LD_PRELOAD和更常见的LD_LIBRARY_PATH之间的区别,请参阅https://stackoverflow.com/q/14715175/5459638。 - XavierStuvw