d - 使用 SWIG 包装 Octave 的 C++ API

d - wrapping octave's C++ API using SWIG

本文关键字:C++ API Octave 包装 使用 SWIG      更新时间:2023-10-16

使用SWIG包装Octave的C++ API的最佳方法是什么?

我所需要的只是接口文件(类似于 wrap_octave.i),它可以用来为另一种语言生成包装器(在我的情况下是 D,但这应该无关紧要)。

我可以通过在接口文件中显式编写它们来包装单个函数,但这很费力。如果我在接口文件中%include头文件,则不清楚在不生成编译器错误的情况下包含哪些头文件。注意:包装器的目标语言不是八度;相反,我想通过C++ api使用另一种语言的嵌入式八度。

我不确定你想要什么,但 SWIG 没有提供简单的快捷方式,例如"不要包装任何不支持的内容"。它不会递归地包含 %include,这通常可以避免包装您不想要的内容,但这意味着您需要手动管理 %include 订单。如果以错误的顺序提供依赖项,SWIG 可能会生成不正确的代码,而不会发出错误或警告消息。

在我的库中,我可以控制头文件,因此我可以轻松排除我不想要的内容,例如

#ifdef SWIG
#define INTERNAL protected
#else
#define INTERNAL public
#endif
class Foo {
public:
    void Bar();
INTERNAL: // hide from SWIG
    void Baz();
};

因此,一种选择是复制标头并修改它们,直到它们适合 SWIG,或者只是删除您不想包装的所有内容。在许多情况下,您还可以%包含未修改的标头,并%忽略您不需要的类和函数。

如果您想对某些数据类型进行特殊处理,请期望弄脏您的手。