2012-06-05 46 views
3

使用SWIG打包八度的C++ API的最佳方式是什么?使用SWIG打包八度的C++ API

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

我可以通过在接口文件中明确写入来包装各个函数,但这很费力。如果我在接口文件中包含头文件,则不清楚要包含哪些文件而不会产生编译器错误。 注意:包装的目标语言不是八度;相反,我想通过C++ api在另一种语言中使用嵌入式八度。

+0

你是想要包装所有的Octave API还是只包含它的一部分?似乎有很多东西只对编写Octave模块有用,而不是将它嵌入到C++中。 (我可以帮助SWIG方面,但我并不十分熟悉Octave写出一个很好的答案) – Flexo

+0

“D在我的情况下,但它应该不重要”当然它很重要。 SWIG的包装语言可能是相当跨语言的,但你必须做的不是。除了最基本,最简单的对象关联之外,做任何事情总是需要一些专用的,特定于语言的代码。 –

回答

1

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

在我的库中,我控制了头文件,所以我可以轻松地排除我不想要的东西,例如

#ifdef SWIG 
#define INTERNAL protected 
#else 
#define INTERNAL public 
#endif 

class Foo { 
public: 
    void Bar(); 
INTERNAL: // hide from SWIG 
    void Baz(); 
}; 

所以一个选项是复制标题和修改,直到他们都适合痛饮,或只是带出你不想换的一切。在许多情况下,你也可以%包含未修改的头文件,而%忽略你不想要的类和函数。

如果您想对某些数据类型进行特殊处理,期望让您的手与类型映射变得很脏。

+1

我喜欢你的答案,但我只是在定义中使用'#ifndef SWIG'而不是'INTERNAL'来做到这一点。 (奇怪的是,内部将公开) – Flexo