使用 cffi 编译多个源文件
Compiling multiple source files with cffi
我最近发现了 cffi
Python 模块,我想用它来为我在 Python 中编写的一些 C 代码编写单元测试。我无法解决的一件事(可以说是简单的)是如何将几个 C 源文件编译成一个 Python 模块,然后可以通过 Python 代码导入。
例如我有四个 C 文件,a.c
、a.h
、b.c
和 b.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
中定义的函数编写单元测试怎么办?
核心思想是利用:
ffi.set_source("_mytest", '''
#include "a.h"
''', sources=["a.c", "b.c"])
编译包含 a.c
和 b.c
并包含 a.h
的模块,后者本身包含 b.h
。这使用 distutils argument sources=[..]
来提供额外的源文件以编译到相同的扩展模块中。在该行之上,您可以在您感兴趣的 C 声明中使用 ffi.cdef()
——通常是 a.h
和 b.h
的子集。 (您可以多次调用 ffi.cdef()
,或者只对由多个部分连接而成的字符串调用一次。)
我最近发现了 cffi
Python 模块,我想用它来为我在 Python 中编写的一些 C 代码编写单元测试。我无法解决的一件事(可以说是简单的)是如何将几个 C 源文件编译成一个 Python 模块,然后可以通过 Python 代码导入。
例如我有四个 C 文件,a.c
、a.h
、b.c
和 b.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
中定义的函数编写单元测试怎么办?
核心思想是利用:
ffi.set_source("_mytest", '''
#include "a.h"
''', sources=["a.c", "b.c"])
编译包含 a.c
和 b.c
并包含 a.h
的模块,后者本身包含 b.h
。这使用 distutils argument sources=[..]
来提供额外的源文件以编译到相同的扩展模块中。在该行之上,您可以在您感兴趣的 C 声明中使用 ffi.cdef()
——通常是 a.h
和 b.h
的子集。 (您可以多次调用 ffi.cdef()
,或者只对由多个部分连接而成的字符串调用一次。)