2012-06-05 75 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