2012-05-25 9 views
12

Mamy dostawcę, który dostarczył nam bibliotekę C++ i nagłówki, które próbuję opakować za pomocą SWIG. Wydaje się, że są one zbyt mądry o połowę z dyrektywami preprocesora:Błędy SWIG z powodu dyrektywy preprocesora

// top.h 
#define DECLARE_WITH_COMMA(a) a, 

a następnie

// foo.h 
#include "top.h" 

#define MY_TYPES(d) \ 
    d(One) \ 
    d(Two) \ 
    d(Three) \ 
    NumElems 

enum MyTypes { 
    MY_TYPES(DECLARE_WITH_COMMA) 
}; 

Jakie to wszystko jest rozwlekłości sposób powiedzenia, że ​​gdy próbuję uruchomić haust (wersja 2.0 0,4) na „Foo.h”, otrzymuję:

foo.h:12: Error: Syntax error in input(1). 

Więc moje pytanie jest, jakie są moje opcje tutaj, biorąc pod uwagę, że prawdopodobnie nie chcesz zmieniać nagłówki dostawcy dostarczone?

+1

Co to jest linia 84? Czy możesz skonstruować minimalny przypadek testowy na podstawie nagłówków, o których mowa, i opublikować go tutaj? –

+0

Dobry pomysł, spróbuję. – laslowh

+1

OK, powyższy kod reprezentuje pełny przypadek testowy. – laslowh

Odpowiedz

12

SWIG nie rekursja do zagnieżdżonych nagłówków domyślnie plik .i tak powinien wyglądać mniej więcej tak:

%module mymod 

%{ 
#include "foo.h" 
%} 

%include "top.h" 
%include "foo.h" 

Jest też przełącznik SWIG:

-includeall  - Follow all #include statements 

ale jeśli masz układ nagłówki, które mogą zrobić więcej, niż zamierzałeś.

+0

dzięki, pracował dla mnie! – TimoSolo

+0

Dodanie dodatkowych włączeń zadziałało dla mnie – mydogisbox

+0

@MarkTolonen, co jeśli 'top.h' ma instrukcję' # include' dla innego pliku nagłówkowego? Mam ten problem. Próbowałem dodać instrukcję '% include' w moim pliku' .i', ale otrzymuję ten sam błąd składniowy. –