使用 cffi 编译多个源文件

Compiling multiple source files with cffi

我最近发现了 cffi Python 模块,我想用它来为我在 Python 中编写的一些 C 代码编写单元测试。我无法解决的一件事(可以说是简单的)是如何将几个 C 源文件编译成一个 Python 模块,然后可以通过 Python 代码导入。

例如我有四个 C 文件,a.ca.hb.cb.h,这样 a.c 包括 a.hb.h 并调用 b.c 中实现的函数。而 b.c 只包括 b.h.

如果我想为 b.c 中实现的函数编写单元测试,我可以简单地这样做:

import cffi

with open('b.h', 'r') as f:
    b_h = f.read()

with open('b.c', 'r') as f:
    b_c = f.read()

ffi = cffi.FFI()

ffi.cdef(b_h)
ffi.set_source('_b', b_c)

# import _b ...

但是如果我想为 a.c 中定义的函数编写单元测试怎么办?

核心思想是利用:

ffi.set_source("_mytest", '''
    #include "a.h"
''', sources=["a.c", "b.c"])

编译包含 a.cb.c 并包含 a.h 的模块,后者本身包含 b.h。这使用 distutils argument sources=[..] 来提供额外的源文件以编译到相同的扩展模块中。在该行之上,您可以在您感兴趣的 C 声明中使用 ffi.cdef()——通常是 a.hb.h 的子集。 (您可以多次调用 ffi.cdef(),或者只对由多个部分连接而成的字符串调用一次。)