4

我的目标是从多个 C 源文件构建单个模块/扩展。实现这一目标的最佳实践是什么?

我尝试了什么:

我知道该ffi.set_source函数具有 optionalsourcesinclude_dirkwargs,并且应该有可能使用这些 kwargs 从多个源文件构建单个共享对象。不幸的是,我在CFFI Documentation的 API 参考中找不到任何关于这些 kwargs 的信息。所以我无法弄清楚细节。是否有任何文件解释如何正确使用这些 kwargs?

我目前使用:

SOURCES = ('file_1.c', 'file_2.c')
SRC_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../src')

ffi_builder = FFI()
ffi_builder.set_source(
    'module_name._module_name',
    ''.join(f'#include "{source}"\n' for source in SOURCES),
    include_dirs=[SRC_ROOT],
)

...

虽然这确实有效,但对我来说似乎有点 hacky。是否可以使用sourceskwarg 而不是第二个位置 arg source?这将使我摆脱骇人听闻的''.join(f'#include "{source}"\n' for source in SOURCES)部分。

如果有更简单的方法,我也会感兴趣!

任何帮助表示赞赏。谢谢!

4

1 回答 1

0

各州的文件set_source

set_source()用于控制如何调用 C 编译器的关键字参数。它们直接传递给distutilssetuptools至少包括sources, include_dirs, define_macros, undef_macros, libraries, library_dirs, extra_objects,extra_compile_argsextra_link_args. 您通常至少需要在Windows 上libraries=['foo']libfoo.soor libfoo.so.X.Y、 or链接。是编译和链接在一起的额外 .c 文件的列表(上面显示的文件总是生成并作为第一个参数自动添加到)。有关其他参数的更多信息,请参阅 distutils 文档。foo.dllsourcesmodule_name.csources

所以是的,你可以sources用作 kwarg

于 2019-09-26T18:15:39.280 回答