【libGL error】Autodl云服务器配置ACT的conda虚拟环境生成训练数据时,遇到了libGL相关错误,涉及swrast_dri.so
问题与解决方案
1. libGL error: MESA-LOADER: failed to open iris
conda install -c conda-forge libstdcxx-ng
来源suffix _dri
下面的问题是在Autodl云服务器上运行程序是出现的,在Ubuntu笔记本上安装的Anaconda没有出现以下问题。
Autodl云服务器安装的是Miniconda3基础镜像,框架版本conda3,python版本3.10(Ubuntu22.04),Cuda版本11.8。
2. 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)
cd /usr/lib/
sudo mkdir dri
cd dri
sudo ln -s /lib/x86_64-linux-gnu/dri/swrast_dri.so swrast_dri.so
sudo ln -s /lib/x86_64-linux-gnu/dri/swrast_dri.so swrast_dri.so
- 命令功能:
ln -s
用于创建一个符号链接(软链接)。 - 目的:这个命令将在当前工作目录中创建一个名为
swrast_dri.so
的符号链接,指向/lib/x86_64-linux-gnu/dri/swrast_dri.so
文件。这样,你可以通过swrast_dri.so
来访问原始文件,而不必使用完整路径。 - 注意:这个命令会在当前目录中创建一个新文件(链接),如果
swrast_dri.so
文件已经存在,则会出错。
3. `GLIBCXX_3.4.30’ not found
libGL error: MESA-LOADER: failed to open swrast: /root/miniconda3/envs/act_a1/bin/…/lib/libstdc++.so.6: version `GLIBCXX_3.4.30’ not found (required by /usr/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)
conda install -c conda-forge gcc
- conda:调用 Conda 包管理工具。
- install:安装软件包。
- -c conda-forge:指定安装源为
conda-forge
频道。conda-forge
是一个提供大量开源软件包的社区驱动频道,通常包含一些官方频道没有的软件包版本。 - gcc:要安装的软件包名称。在这里是
gcc
,即 GNU 编译器集合(GNU Compiler Collection),主要包含 C、C++ 等编程语言的编译器。
conda install -c conda-forge gcc
这个命令的作用是从 conda-forge
频道中安装 gcc
编译器。这样可以确保你在 Conda 环境中获得合适的 GCC 版本,用于编译 C/C++ 程序或安装需要编译的其他软件包。
4. /libstdc++.so.6: version `CXXABI_1.3.8’ not found
libGL error: MESA-LOADER: failed to open swrast: /root/miniconda3/envs/act_a1/bin/…/lib/libstdc++.so.6: version `CXXABI_1.3.8’ not found (required by /usr/lib/dri/swrast_dri.so) (search paths /usr/lib/x86_64-linux-gnu/dri:$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: swrast
云服务器安装的是miniconda3
vi ~/.bashrc
在文件中添加如下代码
(将anaconda3库文件路径添加到系统的库文件路径中)
LD_LIBRARY_PATH=/root/miniconda3/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
在
vi
中的基本编辑操作:
打开文件:
vi filename
进入插入模式并开始编辑:
- 按下
i
键进入插入模式。- 输入或编辑文本内容。
保存并退出:
- 按
Esc
键退出插入模式,回到命令模式。- 输入
:wq
,然后按Enter
键即可保存并退出。
source ~/.bashrc
用系统的libstdc++
库替换miniconda3
环境中的库,避免不同版本之间的兼容性问题。这种方法通常用于解决由于不同libstdc++
版本引起的兼容问题,尤其在使用一些依赖C++标准库的包时效果显著。
-
进入
miniconda3
的lib
目录:cd ~/miniconda3/lib
切换到
miniconda3
安装目录下的lib
文件夹,这是miniconda3
环境中存放库文件的地方。 -
创建备份文件夹:
mkdir backup
创建一个名为
backup
的新文件夹,用于保存当前目录下原有的libstdc++
文件,以便需要时可以还原。 -
将原有的
libstdc++
文件移动到备份文件夹:mv libstd* backup
将所有以
libstd
开头的文件(包含libstdc++
库文件及其符号链接)移动到backup
文件夹中。 -
从系统目录复制
libstdc++.so.6
到当前目录:cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 ./
从系统目录(如
/usr/lib/x86_64-linux-gnu
)复制系统版本的libstdc++.so.6
到当前目录下,以便miniconda3
环境使用系统的libstdc++
库文件。 -
创建符号链接
libstdc++.so
指向libstdc++.so.6
:ln -s libstdc++.so.6 libstdc++.so
创建符号链接
libstdc++.so
,指向刚复制的libstdc++.so.6
,以确保程序能够找到libstdc++
库的主要链接文件。 -
创建符号链接
libstdc++.so.6.0.19
指向libstdc++.so.6
:ln -s libstdc++.so.6 libstdc++.so.6.0.19
创建符号链接
libstdc++.so.6.0.19
,指向libstdc++.so.6
,以确保程序在寻找特定版本6.0.19
的libstdc++
时能够正常找到这个库文件。
使用strings
命令查看libstdc++.so.6.0.19
文件中的字符串,并通过grep
筛选出包含CXXABI
的行。这一步是为了确认当前库的C++ ABI版本号,与其他依赖库的ABI兼容性。
strings ~/miniconda3/lib/libstdc++.so.6.0.19 | grep CXXABI
sudo cp ~/miniconda3/lib/libstdc++.so.6.0.19 /root/miniconda3/envs/act_a1/bin/../lib
cd /root/miniconda3/envs/act_a1/bin/../lib
ls
sudo ln -s libstdc++.so.6.0.19 libstdc++.so.6
-
将
libstdc++.so.6.0.19
复制到另一个环境的lib
目录:sudo cp ~/miniconda3/lib/libstdc++.so.6.0.19 /root/miniconda3/envs/act_a1/bin/../lib
把刚替换后的libstdc++.so.6.0.19
文件复制到act_a1
环境的lib
目录。
-
创建
libstdc++.so.6
的符号链接:sudo ln -s libstdc++.so.6.0.19 libstdc++.so.6
在act_a1
环境的lib
目录中,创建一个符号链接libstdc++.so.6
,指向libstdc++.so.6.0.19
,确保程序在查找libstdc++.so.6
时能找到这个特定的版本。
再次检查C++ ABI版本,确保在act_a1
环境中的新库的C++ ABI版本号符合需求,避免不兼容问题。
strings /root/miniconda3/envs/act_a1/bin/../lib/libstdc++.so.6 | grep CXXABI
5.在远程服务器或无显示设备的环境中 Mujoco 试图渲染图像时遇到了 gladLoadGL error,并且 GLFW 报告 X11 显示环境变量 DISPLAY 缺失
/root/miniconda3/envs/act_a1/lib/python3.8/site-packages/glfw/init.py:914: GLFWError: (65544) b’X11: The DISPLAY environment variable is missing’
warnings.warn(message, GLFWError)
episode_idx=0
Rollout out EE space scripted policy
/root/miniconda3/envs/act_a1/lib/python3.8/site-packages/glfw/init.py:914: GLFWError: (65537) b’The GLFW library is not initialized’
warnings.warn(message, GLFWError)
使用EGL作为渲染后端
在云服务器上,EGL是一种常见的无屏幕(headless)渲染解决方案,适合在没有物理显示器的环境中调用GPU进行渲染。
设置环境变量让MuJoCo等渲染库使用EGL:
export MUJOCO_GL=egl