【问题标题】:Wrap several C-Sources (.c files) to use their functions in Python using SWIG使用 SWIG 包装几个 C 源(.c 文件)以在 Python 中使用它们的函数
【发布时间】:2015-10-21 16:02:24
【问题描述】:

有很多关于如何包装一个 .c 文件的单个函数的教程。但我想包装几个 .c 文件的所有功能。这就是我将它们全部包含在接口文件(interface.i)中的原因

/*interface.i*/
%module interface
%include source1.c
%include source2.c
%include source3.c

我现在想知道是否必须包含所有出现在 .c 文件中的头文件。还有,如果我必须考虑头文件中寻址的头文件。

【问题讨论】:

  • 您能详细说明您的意图吗?你想在你的模块中包含源代码吗?您是否从源代码构建了一个库?
  • 我有一个库和一堆 .c 文件。当我在 C 中使用库时,我只包含头文件并将我的代码与动态库链接。但我想在 Python 中使用这个库的功能。因为我不能只链接动态库,所以我尝试将 .c 文件包装在一起以获得与使用动态 C 库相同的结果

标签: python c interface wrapper swig


【解决方案1】:

通常你的 C 程序应该有一个它公开的接口。例如,source1/2/3.c 和它们的内部头文件 source1/2/3.h 一起编译成 foo.dll。然后接口 foo_function.h 暴露了可以从外部调用的函数。

要包装外部函数,您只需要 interface.i 中的 foo_functions.h。您不需要 source1/2/3.h。
C 代码可能有另一个 foo_constants.h 左右,属于接口,具有您需要的结构和非常方便的常量定义。您也应该添加它。

此外,您可能需要一些来自 SWIG 本身的包含。生成例如指针和数组处理。类似的东西:
%include cpointer.i
%pointer_functions(int, intp)
%include carrays.i
%array_functions(unsigned int, uintarray)

祝你好运!

【讨论】:

  • 只有在我想操作指针/数组时才需要额外的包含,对吧?或者是否需要内部数据处理?
  • 是的,没错。仅当您在 Python 代码中需要它时。通常需要准备作为参数传递给 C 函数的数据,或评估从它们获得的数据作为返回值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多