Python报错libGL error: failed to load driver

运行下述代码后报错:

1
2
import pygame
pygame.init()

完整报错:

libGL error: MESA-LOADER: failed to open iris: /usr/lib/dri/iris_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: swrast
X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  149 (GLX)
  Minor opcode of failed request:  3 (X_GLXCreateContext)
  Value in failed request:  0x0
  Serial number of failed request:  101
  Current serial number in output stream:  102

提示在/usr/lib/dri/找不到iris和swrast驱动。而在/usr/lib/x86_64-linux-gnu/dri这个目录下,两个驱动都有。

解决办法:在上面第一个目录中建立到第二个目录中文件的软链接。

[email protected]:~$ sudo mkdir /usr/lib/dri
[email protected]:~$ cd /usr/lib/dri
[email protected]:/usr/lib/dri$ sudo ln -s /usr/lib/x86_64-linux-gnu/dri/iris_dri.so iris_dri.so
sudo ln -s /usr/lib/x86_64-linux-gnu/dri/swrast_dri.so swrast_dri.so

运行程序,再次报错:

libGL error: MESA-LOADER: failed to open iris: /home/aoyu/AoyuCondaEnv/alien_invasion/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib/x86_64-linux-gnu/libLLVM-15.so.1) (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open swrast: /home/aoyu/AoyuCondaEnv/alien_invasion/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib/x86_64-linux-gnu/libLLVM-15.so.1) (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: swrast
X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  149 (GLX)
  Minor opcode of failed request:  3 (X_GLXCreateContext)
  Value in failed request:  0x0
  Serial number of failed request:  101
  Current serial number in output stream:  102

其中/home/aoyu/AoyuCondaEnv/alien_invasion/是我的Python解释器所在位置。

报错的原因是GLIBCXX_3.4.30' not found。在libstdc++.so.6中看一看所有有关GLIBCXX的信息12

[email protected]:~$ strings /home/aoyu/AoyuCondaEnv/alien_invasion/lib/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
GLIBCXX_DEBUG_MESSAGE_LENGTH
[email protected]_3.4
[email protected]@GLIBCXX_3.4.5
[email protected]_3.4
[email protected]@GLIBCXX_3.4.5
GLIBCXX_3.4.21
GLIBCXX_3.4.9
[email protected]@GLIBCXX_3.4.11
GLIBCXX_3.4.10
GLIBCXX_3.4.16
GLIBCXX_3.4.1
[email protected]_3.4
GLIBCXX_3.4.28
[email protected]_3.4
GLIBCXX_3.4.25
[email protected]@GLIBCXX_3.4.5
[email protected]@GLIBCXX_3.4.5
[email protected]_3.4
[email protected]_3.4
_ZN[email protected]@GLIBCXX_3.4.5
[email protected]_3.4
[email protected]@GLIBCXX_3.4.11
[email protected]@GLIBCXX_3.4
[email protected]@GLIBCXX_3.4.5
[email protected]@GLIBCXX_3.4.5
[email protected]@GLIBCXX_3.4.5
[email protected]_3.4
GLIBCXX_3.4.24
[email protected]@GLIBCXX_3.4.11
GLIBCXX_3.4.20
[email protected]@GLIBCXX_3.4.5
GLIBCXX_3.4.12
[email protected]@GLIBCXX_3.4.5
GLIBCXX_3.4.2
[email protected]@GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.15
[email protected]@GLIBCXX_3.4.5
[email protected]_3.4
GLIBCXX_3.4.19
[email protected]_3.4
[email protected]_3.4
GLIBCXX_3.4.27
[email protected]@GLIBCXX_3.4
[email protected]@GLIBCXX_3.4
[email protected]_3.4
[email protected]_3.4
[email protected]@GLIBCXX_3.4.5
GLIBCXX_3.4.23
GLIBCXX_3.4.3
GLIBCXX_3.4.7
[email protected]@GLIBCXX_3.4.5
[email protected]@GLIBCXX_3.4.5
[email protected]_3.4
[email protected]@GLIBCXX_3.4.5
[email protected]@GLIBCXX_3.4.5
GLIBCXX_3.4.18
_ZN[email protected]GLIBCXX_3.4
[email protected]@GLIBCXX_3.4.5
[email protected]@GLIBCXX_3.4.14
[email protected]_3.4
GLIBCXX_3.4.29
[email protected]_3.4
[email protected]_3.4
[email protected]@GLIBCXX_3.4
[email protected]_3.4
[email protected]@GLIBCXX_3.4.11
[email protected]@GLIBCXX_3.4.5
[email protected]_3.4
[email protected]_3.4
[email protected]_3.4
[email protected]@GLIBCXX_3.4.5
[email protected]_3.4
[email protected]@GLIBCXX_3.4.5
[email protected]@GLIBCXX_3.4
GLIBCXX_3.4.22
[email protected]@GLIBCXX_3.4.5
[email protected]_3.4
[email protected]@GLIBCXX_3.4.5
GLIBCXX_3.4.8
GLIBCXX_3.4.13
[email protected]@GLIBCXX_3.4.11
_ZNKSt14basic_ofstreamIwSt11char_traitsIwEE7is_[email protected]@GLIBCXX_3.4.5
GLIBCXX_3.4.17
GLIBCXX_3.4.4
[email protected]@GLIBCXX_3.4.5
[email protected]_3.4
[email protected]@GLIBCXX_3.4.5
GLIBCXX_3.4.26
[email protected]_3.4

确实,最高版本是GLIBCXX_3.4.29

(这里为了方便,我用sudo su -切换为了root)

看一下libstdc++.so.6这个文件的信息:

(base) [email protected]:~# ls -l /home/aoyu/AoyuCondaEnv/alien_invasion/lib/libstdc++.so.6
lrwxrwxrwx 1 aoyu aoyu 19  1月 26 13:25 /home/aoyu/AoyuCondaEnv/alien_invasion/lib/libstdc++.so.6 -> libstdc++.so.6.0.29
(base) [email protected]:~# ls -l /home/aoyu/AoyuCondaEnv/alien_invasion/lib/libstdc++.so.6.0.29
-rwxrwxr-x 3 aoyu aoyu 17981480  6月  1  2022 /home/aoyu/AoyuCondaEnv/alien_invasion/lib/libstdc++.so.6.0.29

是一个指向libstdc++.so.6.0.29的链接。

找找电脑里有没有libstdc++.so新一点的版本:

(base) [email protected]:~# find / -name "libstdc++.so*"
/opt/anaconda3/lib/libstdc++.so
/opt/anaconda3/lib/libstdc++.so.6.0.29
/opt/anaconda3/lib/libstdc++.so.6
/opt/anaconda3/pkgs/libstdcxx-ng-11.2.0-h1234567_1/lib/libstdc++.so
/opt/anaconda3/pkgs/libstdcxx-ng-11.2.0-h1234567_1/lib/libstdc++.so.6.0.29
/opt/anaconda3/pkgs/libstdcxx-ng-11.2.0-h1234567_1/lib/libstdc++.so.6
/home/aoyu/.conda/pkgs/libstdcxx-ng-11.2.0-h1234567_1/lib/libstdc++.so
/home/aoyu/.conda/pkgs/libstdcxx-ng-11.2.0-h1234567_1/lib/libstdc++.so.6.0.29
/home/aoyu/.conda/pkgs/libstdcxx-ng-11.2.0-h1234567_1/lib/libstdc++.so.6
/home/aoyu/AoyuCondaEnv/alien_invasion/lib/libstdc++.so
/home/aoyu/AoyuCondaEnv/alien_invasion/lib/libstdc++.so.6.0.29
/home/aoyu/AoyuCondaEnv/alien_invasion/lib/libstdc++.so.6
find: ‘/run/user/1000/doc’: 权限不够
find: ‘/run/user/1000/gvfs’: 权限不够
/usr/lib/gcc/x86_64-linux-gnu/12/libstdc++.so
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30-gdb.py
/snap/core20/1778/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/snap/core20/1778/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28
/snap/core20/1778/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28-gdb.py
/snap/core20/1623/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/snap/core20/1623/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28
/snap/core20/1623/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28-gdb.py
(base) [email protected]:~# 

看到最新的版本是/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30

看一下里面有没有GLIBCXX_3.4.30

(base) [email protected]:~# strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
GLIBCXX_3.4.30
GLIBCXX_DEBUG_MESSAGE_LENGTH

可以看到里面有GLIBCXX_3.4.30,那接下来就用这个libstdc++.so替换旧的:

(base) [email protected]:~# cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 /home/aoyu/AoyuCondaEnv/alien_invasion/lib/
(base) [email protected]:~# rm /home/aoyu/AoyuCondaEnv/alien_invasion/lib/libstdc++.so.6.0.29
(base) [email protected]:~# rm /home/aoyu/AoyuCondaEnv/alien_invasion/lib/libstdc++.so.6
(base) [email protected]:~# ln -s /home/aoyu/AoyuCondaEnv/alien_invasion/lib/libstdc++.so.6.0.30 /home/aoyu/AoyuCondaEnv/alien_invasion/lib/libstdc++.so.6

来确认一下替换libstdc++.so.6是不是成功了:

(base) [email protected]:~# strings /home/aoyu/AoyuCondaEnv/alien_invasion/lib/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
GLIBCXX_3.4.30
GLIBCXX_DEBUG_MESSAGE_LENGTH

里面含有GLIBCXX_3.4.30,确实成功了。

运行程序试试,程序成功运行。

参考资料

conda + openai-gym + 核显 报错:libGL error: MESA-LOADER: failed to open iris

Anaconda libstdc++.so.6: version `GLIBCXX_3.4.20’ not found