2012-06-05 2 views
3

SWIG를 사용하여 옥타브의 C++ API를 래핑하는 가장 좋은 방법은 무엇입니까?SWIG를 사용하여 옥타브의 C++ API를 래핑

내가 필요한 것은 인터페이스 파일 (wrap_octave.i와 같은)이 될 것이고, 다른 언어에 대한 래퍼를 생성하는 데 사용할 수 있습니다 (제 경우에는 D이지만 중요하지 않습니다).

인터페이스 파일에 명시 적으로 작성하여 개별 기능을 감쌀 수 있지만 힘들어요. 헤더 파일을 인터페이스 파일에 포함 시키면 컴파일러 오류가 발생하지 않고 포함시킬 파일이 분명하지 않습니다. 참고 : 래퍼의 대상 언어는 옥타브가 아닙니다. 대신 C++ API를 통해 다른 언어로 내장 옥타브를 사용하고 싶습니다.

+0

옥타브 API 전체 또는 일부만 둘러보기를 원하십니까? 옥타브 모듈을 작성하는 데만 유용하고 C++에 포함시키지 않는 것은 상당히 많은 것 같습니다. (나는 SWIG 쪽에서 도울 수 있지만 훌륭한 대답을 쓰기에는 옥타브에 익숙하지 않다.) – Flexo

+0

"내 경우는 그렇지만 중요하지 않아야한다."물론 중요합니다. 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(); 
}; 

그래서 하나의 옵션은 헤더를 복제하고 그들이 SWIG에 적합 할 때까지 수정하거나 당신이 포장하고 싶지 않아 모든 것을 제거하는 것입니다. 대부분의 경우 수정되지 않은 헤더를 % 포함 할 수도 있고, 원하지 않는 클래스와 함수를 무시할 수도 있습니다.

일부 데이터 유형에 대해 특별한 대우를 원한다면 typemaps로 손을 더럽힐 것입니다.

+1

당신의 답을 좋아하지만 'INTERNAL'대신 '#ifndef SWIG'를 사용하면됩니다. (내부가 공개 될 것이라는 것이 이상하게 보입니다) – Flexo

관련 문제