2012-05-25 14 views
12

Abbiamo un fornitore che ci ha fornito una libreria e intestazioni C++, che sto cercando di avvolgere usando SWIG. Sembra che essi sono troppo intelligente da un mezzo con le direttive del preprocessore:Errori SWIG a causa della direttiva preprocessore

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

e poi

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

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

enum MyTypes { 
    MY_TYPES(DECLARE_WITH_COMMA) 
}; 

che è tutto un modo prolisso per dire che quando provo a correre SWIG (versione 2.0 0,4) su "foo.h", ottengo:

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

Quindi la mia domanda è che cosa sono le opzioni qui, dato che probabilmente non voglio cambiare le intestazioni forniti dal produttore?

+1

Qual è la linea 84? Puoi costruire un caso di test minimale basato sulle intestazioni in questione e pubblicarlo qui? –

+0

Buona idea, ci proverò. – laslowh

+1

Ok, il codice sopra ora rappresenta un caso di test completo. – laslowh

risposta

12

SWIG non recurse nelle intestazioni nidificate per impostazione predefinita, in modo che il file di .i dovrebbe essere simile:

%module mymod 

%{ 
#include "foo.h" 
%} 

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

C'è anche un interruttore SWIG:

-includeall  - Follow all #include statements 

ma se si dispone di sistema intestazioni che potrebbero fare più di quello che intendi.

+0

grazie, ha funzionato per me! – TimoSolo

+0

Aggiunta di ulteriori funzioni ha funzionato per me – mydogisbox

+0

@MarkTolonen, cosa succede se 'top.h' ha un'istruzione' # include' per un altro file di intestazione? Sto avendo questo problema. Ho provato ad aggiungere un'istruzione '% include' nel mio file' .i', ma sto ottenendo lo stesso errore di sintassi. –

Problemi correlati