如何使用 SWIG 包装许多 .h 文件并包含任何依赖项?
Posted
技术标签:
【中文标题】如何使用 SWIG 包装许多 .h 文件并包含任何依赖项?【英文标题】:How can I wrap many .h files with SWIG and include any dependencies? 【发布时间】:2014-09-04 17:30:08 【问题描述】:基本上,我有一个庞大的现有代码库,我想使用 SWIG 将所有 .h 文件包装在一个特定目录中。这些 .h 文件中的许多类都继承自目录树中其他地方定义的其他类,手动跟踪它们会很痛苦。有什么方法可以让 SWIG 自动包含这些或至少自动创建 .i 文件?我不想在我自己的代码(例如标准库)之外包装任何类,但如果我使用 -importall
选项,这些最终会被包含在内。
【问题讨论】:
好问题。希望您提出的问题有好的解决方案。 【参考方案1】:没有一种内置方法可以自动生成 .i 文件,或者使用文件夹中的所有 .h 和所有“其他 .h 以使其正常工作”填充 .i
部分原因是“正常工作”是完全任意的:如果 A 在您要导出的那组标头中,并且 A 派生自 B,您是否需要导出 B“才能正常工作”?一点也不。但你可能想要。而且即使A返回了B的实例,还需要导出B吗?不(所以不需要在 .i 中导入 B.h),SWIG 返回的对象将是 B 实例的不透明句柄,尽管您无法在其上调用任何方法,但您可以提供它作为接受 B 作为参数的函数的参数。
最实用的方法是编写一个批处理或 python 脚本来找到你想要的 .h 的基本集(如果都在同一个文件夹中,则为一个衬里),复制/粘贴到你的 .i 中,然后手动清理 .i仅包含您真正想要导出到目标语言的文件,并添加任何缺少的文件以获得您想要的某些功能(如实例化基类等)。你可以随心所欲地说“不,我不想定制”,你别无选择。
【讨论】:
就像我说的,我想导出一组给定头文件中的所有内容,并且只导出它们正常工作所需的任何其他内容。我不能有手动清理步骤;一个静态 .i 文件将导入所有必要的文件,或者一个 .i 文件将完全自动生成。 “让他们正常工作”是任意的:我认为您误解了 SWIG 的工作原理。我已经更新了帖子,我希望它更清楚。 如果 A 派生自 B 并且您只导出 A,SWIG 会包装从 B 继承的成员函数吗?我对此表示怀疑。以上是关于如何使用 SWIG 包装许多 .h 文件并包含任何依赖项?的主要内容,如果未能解决你的问题,请参考以下文章
使用 SWIG 为 Python 包装 C++。 “向量”未声明