Conda虚拟环境下libp11-kit.so.0: undefined symbol: ffi_type_pointer...问题解决

ops/2024/9/23 18:00:27/

Conda虚拟环境下libp11-kit.so.0: undefined symbol: ffi_type_pointer...问题解决

  • 1 背景说明
  • 2 报错原因
  • 3 解决方法
  • 4 补充说明

1 背景说明

最近需要在Conda虚拟环境下运行ROS相关代码,其中在运行代码import moveit_commander时,返回报错ImportError: /lib/x86_64-linux-gnu/libp11-kit.so.0: undefined symbol: ffi_type_pointer, version LIBFFI_BASE_7.0。由于在网上没有找到和我一样的问题,且在github上也没找到解决方法,以为是个例就没打算记录,后来在与同学交流过程中发现,他们在conda虚拟环境中使用ROS时,均出现这种错误,故此记录错误并提出一种解决方法,希望能够对解决此类问题有所帮助。

2 报错原因

可以看到,我的报错来源是我在pythonimport moveit_commander,但是可能其他命令也会报出该错误,但是报错原因均来自libp11-kit.so.0: undefined symbol: ffi_type_pointer, version LIBFFI_BASE_7.0,结合github上相关问题的讨论,理解过来意思大概就是libffi的版本不一致,导致了libp11-kit.so.0在使用时出现了未定义符号问题。其实可以推到以后出现同类型问题,解决方法也应该基本类似。

3 解决方法

打开至conda虚拟环境下lib文件夹中,路径为/home/anaconda3/envs/xxx/lib,在文件夹内启动终端,输入命令ls -l,获得结果如图所是。
在这里插入图片描述
这里,由于我已经修改了链接,所以可能会有所不同。可以看到,你的libffi.so.7链接至libffi.so.8.1.0,所以,这也就是为什么会在程序中,libffi报版本错误了。找到原因,解决方法也很简单,我这边选择的方式是将该路径下的libffi.so.7文件备份后(重命名为libffi_bak.so.7),再在该路径下创建一个新的libffi.so.7链接至/lib/x86_64-linux-gnu/libffi.so.7.1.0,即输入命令:

python">sudo ln -s /lib/x86_64-linux-gnu/libffi.so.7.1.0 libffi.so.7
sudo ldconfig

至此,再次运行程序,问题应该就解决了。

4 补充说明

上述过程解决问题后,师弟秉持打破沙锅问到底的精神,一直在追究为什么会出现这种情况。。。后来,找到问题所在:原来是Python 3.8.16版本在安装过程中,就会默认安装libffi-3.4.2,在该库中,就会出现旧版本兼容老版本问题,即出现libffi.so.7链接至libffi.so.8.1.0,进而产生报错。而在python3.8.10中,默认安装libffi-3.3版本,在该版本内,libffi.so.7链接至libffi.so.7.1.0,就不会产生上述问题。因此,另一种解决方式即为安装python 3.8.10,同样能解决该问题。


http://www.ppmy.cn/ops/87645.html

相关文章

【C++】stack和queue的模拟实现 双端队列deque的介绍

🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 🌈前言🔥stack的模拟实现🔥queue的模拟实现🔥deque(双端队列)deque的缺陷 🌈为什么选择…

【AI 大模型】OpenAI 接口调用 ① ( 安装 openai 软件包 | 查看 openai 软件包版本 | PyCharm 中开发 Python 程序调用 OpenAI 接口 )

文章目录 一、安装 Python SDK二、安装 OpenAI Python SDK1、安装 openai 软件包2、查看 openai 软件包版本3、openai 接口参考文档 三、PyCharm 中开发 Python 程序调用 OpenAI 接口1、PyCharm 创建 Python 项目2、API Key 配置用法3、GPT3 模型和 GPT4 模型4、Python 代码示例…

java常见面试题(160道)

1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了…

【Java】还不懂this关键字?一分钟彻底弄懂this关键字

博主简介:努力学习的预备程序媛一枚~博主主页: 是瑶瑶子啦所属专栏: Java岛冒险记【从小白到大佬之路】 前言 问题:为什么会存在this? 在上一篇【JavaSE】一文看懂构造器/构造方法(Cunstructor)中,我们已…

Java中的Heap(堆)(如果想知道Java中有关堆的知识点,那么只看这一篇就足够了!)

前言:(Heap)是一种特殊的完全二叉树,它在诸多算法中有着广泛的应用,本文将详细介绍Java中的堆。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 先让我们看一下本文大…

【c++】继承学习(一):继承机制与基类派生类转换

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章我们来学习继承部分 目录 1.继承的概念和定义继承的定义继承基类成员的访问方式变化 2.基类和派生类对象赋值转换3.继承中的作用域 1.继承的概念和定义 …

Anaconda安装-超详细版(2023)

Anaconda安装 - 超详细版(2023) 前言:彻底卸载pythonAnaconda下载地址安装详细步骤配置环境变量检验安装是否成功更改conda源(后续安装第三方库可以加快速度)超详细彻底卸载Anaconda教程Tensorflow-gpu 安装 前言&…

【C++】C++11的新特性 --- 右值引用与移动语义

假如生活欺骗了你 不要悲伤,不要心急! 忧郁的日子里须要镇静 相信吧 快乐的日子将会来临 -- 普希金 《假如生活欺骗了你》 C11的新特性 1 左值与右值2 左值引用和右值引用3 引用的意义4 移动语义4.1 移动构造与移动赋值4.2 区分现代写法与移动语义…