【问题标题】:Python CFFI: Build single module from multiple source filesPython CFFI:从多个源文件构建单个模块
【发布时间】:2020-01-26 05:56:06
【问题描述】:

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

我尝试了什么:

我知道ffi.set_source 函数具有可选的sourcesinclude_dir kwargs,并且应该可以使用这些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。是否可以使用sources kwarg 而不是第二个位置参数source?这将使我摆脱 hacky ''.join(f'#include "{source}"\n' for source in SOURCES) 部分。

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

感谢任何帮助。谢谢!

【问题讨论】:

    标签: python python-3.x pypy python-cffi cffi


    【解决方案1】:

    documentation for set_source 状态

    set_source() 的关键字参数控制如何调用 C 编译器。它们直接传递给distutilssetuptools,至少包括sourcesinclude_dirsdefine_macrosundef_macroslibrarieslibrary_dirsextra_objects、@98765434@98765433333 @。在 Windows 上,您通常至少需要 libraries=['foo'] 才能与 libfoo.solibfoo.so.X.Yfoo.dll 链接。 sources 是编译和链接在一起的额外 .c 文件的列表(上面显示的文件 module_name.c 始终会生成并作为第一个参数自动添加到 sources)。有关其他参数的更多信息,请参阅 distutils 文档。

    所以是的,您可以使用 sources 作为 kwarg

    【讨论】:

    • 您好,谢谢您的回答!我到底要传递什么给sources?文档并没有真正帮助:bash Help on function set_source in cffi.FFI: $ pydoc cffi.FFI.set_source cffi.FFI.set_source = set_source(self, module_name, source, source_extension='.c', **kwds) (END) 在这种情况下,我必须将什么传递给第二个必需的参数source
    • 见上面的粗体字:sources是c文件的列表
    猜你喜欢
    • 2010-12-09
    • 2012-11-16
    • 2019-09-22
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多