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++

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐