【libGL error】Autodl云服务器配置ACT的conda虚拟环境生成训练数据时,遇到了libGL相关错误,涉及swrast_dri.so

问题与解决方案

1. libGL error: MESA-LOADER: failed to open iris

bash 复制代码
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)
bash 复制代码
cd  /usr/lib/
sudo mkdir dri
bash 复制代码
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)

bash 复制代码
 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

bash 复制代码
 vi  ~/.bashrc

在文件中添加如下代码

(将anaconda3库文件路径添加到系统的库文件路径中)

bash 复制代码
LD_LIBRARY_PATH=/root/miniconda3/lib:$LD_LIBRARY_PATH     
export LD_LIBRARY_PATH

vi中的基本编辑操作:

  1. 打开文件vi filename

  2. 进入插入模式并开始编辑

    • 按下 i 键进入插入模式。
    • 输入或编辑文本内容。
  3. 保存并退出

    • Esc 键退出插入模式,回到命令模式。
    • 输入 :wq ,然后按 Enter 键即可保存并退出。
bash 复制代码
source  ~/.bashrc

用系统的libstdc++库替换miniconda3环境中的库,避免不同版本之间的兼容性问题。这种方法通常用于解决由于不同libstdc++版本引起的兼容问题,尤其在使用一些依赖C++标准库的包时效果显著。

  • 进入miniconda3lib目录

    bash 复制代码
    cd ~/miniconda3/lib

    切换到miniconda3安装目录下的lib文件夹,这是miniconda3环境中存放库文件的地方。

  • 创建备份文件夹

    bash 复制代码
    mkdir backup 

    创建一个名为backup的新文件夹,用于保存当前目录下原有的libstdc++文件,以便需要时可以还原。

  • 将原有的libstdc++文件移动到备份文件夹

    bash 复制代码
    mv libstd* backup  

    将所有以libstd开头的文件(包含libstdc++库文件及其符号链接)移动到backup文件夹中。

  • 从系统目录复制libstdc++.so.6到当前目录

    bash 复制代码
    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

    bash 复制代码
    ln -s libstdc++.so.6 libstdc++.so

    创建符号链接libstdc++.so,指向刚复制的libstdc++.so.6,以确保程序能够找到libstdc++库的主要链接文件。

  • 创建符号链接libstdc++.so.6.0.19指向libstdc++.so.6

    bash 复制代码
    ln -s libstdc++.so.6 libstdc++.so.6.0.19

    创建符号链接libstdc++.so.6.0.19,指向libstdc++.so.6,以确保程序在寻找特定版本6.0.19libstdc++时能够正常找到这个库文件。

使用strings命令查看libstdc++.so.6.0.19文件中的字符串,并通过grep筛选出包含CXXABI的行。这一步是为了确认当前库的C++ ABI版本号,与其他依赖库的ABI兼容性。

bash 复制代码
strings ~/miniconda3/lib/libstdc++.so.6.0.19 | grep CXXABI
bash 复制代码
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版本号符合需求,避免不兼容问题。

bash 复制代码
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:

bash 复制代码
export MUJOCO_GL=egl
相关推荐
安卓开发者25 分钟前
Docker常用镜像使用指南:从入门到实战
运维·docker·容器
橘颂TA26 分钟前
【C/C++】进程
服务器
Lenyiin1 小时前
《 Linux 点滴漫谈: 三 》掌控终端:让 Shell 成为你的系统魔杖
linux·运维·服务器·lenyiin
杭州泽沃电子科技有限公司1 小时前
钢铁厂运输设备在线监测:构建智能工厂的安全与效率基石
运维·人工智能·智能监测
Lynnxiaowen1 小时前
今天我们学习python编程常用模块与面向对象
运维·python·学习·云计算
霖.241 小时前
Docker常见问题
服务器·docker·云原生·容器
一匹电信狗1 小时前
【MySQL】数据库表的操作
linux·运维·服务器·数据库·mysql·ubuntu·小程序
递归不收敛1 小时前
Conda 常用命令汇总(新手入门笔记)
笔记·conda
撬动未来的支点2 小时前
【Linux】Linux 零拷贝技术全景解读:从内核到硬件的性能优化之道
linux·服务器·性能优化
ajassi20002 小时前
开源 Linux 服务器与中间件(六)服务器--Lighttpd
linux·服务器·开源