我想使用cffi
(如果必须的话,甚至可以使用ctypes
)来访问Linux上python3中的cabi。这个API由许多.so
文件(我们称它们为libA.so
、libB.so
和{libA
包含主要的导出函数,而其他lib则为libA
提供支持。在
现在,libA
依赖于libB
,而{libA
定义的全局数组,libC
希望存在。所以libC
实际上依赖于libA
-一个循环依赖。尝试使用cffi或与dlopen
等价的ctag来加载libA
会导致libB
和{libC
首先会导致有关丢失数组的错误(该数组位于libA
中)。在
因为它是一个变量,而不是一个函数,所以RTLD_LAZY选项在这里似乎不适用。在
奇怪的是,ldd libA.so
没有将libB
或{
有办法绕过这个问题吗?一个想法是创建一个新的共享对象(比如全部。所以)依赖于libA
、libB
和{
处理这种情况的最佳策略是什么?实际上,我尝试访问的ABI相当大,可能有20-30个共享对象文件。在
这(如果我正确地理解了问题的话)是一个非常正常的关于Nix的用例,应该可以正常运行。在
在处理与ctypes([Python 3]: ctypes - A foreign function library for Python)相关的问题时,解决这些问题的最佳(通用)方法是:
我准备了一个小例子:
定义.h:
libClibC:
libC.h:
libC.c:
伦敦银行同业拆借
libB.h:
图书馆:
伦敦银行同业拆借
libA.h:
利比亚共和国:
代码.py:
输出:
但是如果你的数组被声明为static([CPPReference]: C keywords: static)(因此,它不能像示例中那样是extern),那么你就有点受不了了。在
@EDIT0:扩展示例,使其更适合描述。在
因为每个元素之间的依赖关系都是动态加载的。在
实用工具:
实用工具c:
下面是libB.c的修改版本。注意同样的模式也应该应用于原始的libA.c。在
图书馆:
输出:
我相信这又重复了这个问题。现在,如果修改(1st部分)代码.py收件人:
您将得到以下输出:
注意事项:
RTLD_LAZY | RTLD_GLOBAL
中存在是非常重要的。如果RTLD_LAZY被RTLD\u NOW取代,它将不起作用相关问题 更多 >
编程相关推荐