解决lerobot当中ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found问题
这是一个临时的解决和测试方法,如果这种方法有效,说明问题确实是动态链接器没能优先使用 Conda 环境中的新版。这类错误通常是由于项目所需的包版本较高,ubuntu系统版本低,导致包缺失的问题。首先,运行带摄像头遥操后出现的是以下报错(如果没有或已经解决请跳转至。按照所说的方法,并且移除conda环境中的opencv相关库。环境变量,强制程序在启动时首先加载这个特定版本的。环境变量,强制程序在启动
ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29’ not found (required by /home/robot/miniconda3/envs/lerobot/lib/python3.10/site-packages/cv2.cpython-310-x86_64-linux-gnu.so)
环境:Ubuntu 22.04、miniconda3、python3.10
概览:
这类错误通常是由于项目所需的包版本较高,ubuntu系统版本低,导致包缺失的问题
解决办法为:找到一个包含所需 GLIBCXX 版本 (如 GLIBCXX_3.4.29 或更高) 的 libstdc++.so.6 文件。通过设置 LD_PRELOAD 环境变量,强制程序在启动时首先加载这个特定版本的 libstdc++.so.6,从而覆盖掉系统默认链接到的那个旧版本。
# 运行so101带摄像头遥操作指令:
(lerobot) robot@pc:~/lerobot$ python lerobot/scripts/control_robot.py --robot.type=so101 --control.type=teleoperate
# 输出报错
ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /home/robot/miniconda3/envs/lerobot/lib/python3.10/site-packages/cv2.cpython-310-x86_64-linux-gnu.so)
# 解决办法:
export LD_PRELOAD=/home/robot/miniconda3/envs/lerobot/lib/libstdc++.so.6:$LD_PRELOAD
解决过程:
首先,运行带摄像头遥操后出现的是以下报错(如果没有或已经解决请跳转至 报错2)
import cv2
ImportError: /home/robot/miniconda3/envs/lerobot/lib/python3.10/site-packages/cv2/python-3.10/../../../.././libtiff.so.6: undefined symbol: jpeg12_write_raw_data, version LIBJPEG_8.0
尝试了之后,在lerobot的github链接中找到了相关issue:
lerobot/examples /10_use_so100.md got “undefined symbol: jpeg12_write_raw_data, version LIBJPEG_8.0” #679
https://github.com/huggingface/lerobot/issues/679
按照所说的方法,并且移除conda环境中的opencv相关库
conda install -y -c conda-forge ffmpeg
pip uninstall -y opencv-python opencv-python-headless opencv-contrib-python
conda remove opencv libopencv
conda install -y -c conda-forge "opencv=4.10.0" libtiff libjpeg-turbo
运行完上面几步,进行测试:
python -c "import cv2; print(f'OpenCV version: {cv2.__version__}')"
输出:
(lerobot) robot@pc:~/lerobot$ python -c "import cv2; print(f'OpenCV version: {cv2.__version__}')"
OpenCV version: 4.10.0
再次尝试启动带摄像头遥操作:
(lerobot) robot@pc:~/lerobot$ python lerobot/scripts/control_robot.py --robot.type=so101 --control.type=teleoperate
报错2
随后,报错变为`GLIBCXX_3.4.29’ not found:
import cv2
ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /home/robot/miniconda3/envs/lerobot/lib/python3.10/site-packages/cv2.cpython-310-x86_64-linux-gnu.so)
参考该篇博客:
丝滑解决ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found问题
https://blog.csdn.net/weixin_45942927/article/details/134028773
按其方法,查找电脑里的GLIBCXX(需要改为自己的路径)
sudo find / -name "libstdc++.so.6*"
能看到存在这么一条
/root/miniconda3/lib/libstdc++.so.6.0.29
说明conda里面有所需要的环境,运行
strings /root/miniconda3/lib/libstdc++.so.6.0.29 | grep GLIBCXX
输出的结果如下,可以发现里面有我们需要的版本3.4.29
新终端:
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
看到系统里最高3.4.28,所以会报错
设置 LD_PRELOAD 环境变量,强制程序在启动时首先加载这个特定版本的 libstdc++.so.6,从而覆盖掉系统默认链接到的那个旧版本:
export LD_PRELOAD=/home/robot/miniconda3/envs/lerobot/lib/libstdc++.so.6:$LD_PRELOAD
再次运行带摄像头遥操作指令:
python lerobot/scripts/control_robot.py --robot.type=so101 --control.type=teleoperate
问题得到解决
但需要注意:export LD_PRELOAD=... 这个设置只在当前终端会话中有效。如果关闭终端再打开,需要重新设置。
这是一个临时的解决和测试方法,如果这种方法有效,说明问题确实是动态链接器没能优先使用 Conda 环境中的新版 libstdc++
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)