使用cffi编译多个源文件

时间:2019-05-04 18:06:47

标签: python python-cffi

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

例如,我有四个C文件,a.ca.hb.cb.h,这样a.c既包含a.h又包含b.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中定义的函数编写单元测试该怎么办?

1 个答案:

答案 0 :(得分:1)

核心思想是使用:

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(),也可以在串联多个片段后的字符串上调用一次。)