如何使用 CFFI 将包含其标头的 C 库包装到 python 程序中?

Posted

技术标签:

【中文标题】如何使用 CFFI 将包含其标头的 C 库包装到 python 程序中?【英文标题】:How do I wrap a C-library including its header into a python program using CFFI? 【发布时间】:2015-10-05 20:26:59 【问题描述】:
from cffi import FFI
ffi = FFI()
header_path = '/usr/include/libelf.h'
with open(header_path) as f:
      ffi.cdef(f.read())
lib = ffi.dlopen('/usr/local/lib/libelf.so')

上面的代码是我真正遇到的问题。为了使用 libelf 的一些功能,我需要包装库和头文件。经过长时间的研究,这似乎是做到这一点的正确方法。

但是我得到一个解析错误:

无法解析“#ifndef _LIBELF_H”

似乎所有这些表达式都会导致解析错误。我怎么解决这个问题?还是有另一种包装两者的方法:库和标题?

【问题讨论】:

【参考方案1】:

ffi.cdef() 不能处理预处理器指令。 ffi.cdef() 的目的是指定在 python 和 C 之间共享的对象。它没有被编译 (this example does not call any C compiler)。要么从文件流f 中删除所有预处理器指令,要么挑选你真正需要的那些标题部分并将它们复制粘贴到你的 ffi.cdef() 中。

【讨论】:

刚才我明白了,我的答案来得太晚了~5 年。干杯。

以上是关于如何使用 CFFI 将包含其标头的 C 库包装到 python 程序中?的主要内容,如果未能解决你的问题,请参考以下文章

为自定义 C 库分发 CFFI 包装器

使用 CFFI 从 Python 传递指向 C 函数的指针的最佳方法

我可以用 C 包装 OpenCV 的 C++ 接口,然后用 Lisp 的 CFFI 包装它吗?

将标志添加到 cffi 编译过程

如何在 Numba 中使用指针包装 CFFI 函数

使用 CFFI 在 Python 中创建 CData 类型的缓冲区