2010-09-12 3 views
3

Je n'arrive pas à obtenir l'exemple simple suivant pour travailler avec SWIG 1.3.40 (et j'ai également essayé 1.3.31). La structure de Foo se présente sous la forme d'un module Python tant que je ne l'enveloppe pas dans un espace de noms, mais dès que je le fais, j'obtiens une erreur de compilation dans le test_wrap.c généré.SWIG - Problème avec les espaces de noms

test.h:

#ifndef __TEST_H__ 
#define __TEST_H__ 

#define USE_NS 1 

#if USE_NS 
namespace ns { 
#endif 

struct Foo { 
    float a; 
    float b; 
    float func(); 
}; 

#if USE_NS 
} 
#endif 

#endif 

test.cpp

#include "test.h" 

#if USE_NS 
namespace ns { 
#endif 

float Foo::func() 
{ 
    return a; 
} 

#if USE_NS 
} 
#endif 

test.i

%module test 
%{ 
#include "test.h" 
%} 

%include "test.h" 

I exécuter les commandes suivantes pour construire un paquet sur OSX 10.6.3:

swig -python test.i 
g++ -c -m64 -fPIC test.cpp 
g++ -c -m64 -fPIC -I/usr/local/include -I/opt/local/include -I/opt/local/Library/Frameworks/Python.framework/Headers test_wrap.c 
g++ -o _test.so -bundle -flat_namespace -undefined suppress test_wrap.o test.o -L/usr/local/lib -L/opt/local/lib -lpython2.6 

Cela fonctionne, mais seulement si je sors l'espace de noms. Je pense que SWIG gère automatiquement les espaces de noms dans des cas simples comme celui-ci. Qu'est-ce que je fais mal?

C'est l'erreur que j'ai - il semble que SWIG fasse référence à un 'ns' et un symbole 'namespace' qui ne sont pas définis.

test_wrap.c: In function ‘int Swig_var_ns_set(PyObject*)’: 
test_wrap.c:2721: error: expected primary-expression before ‘=’ token 
test_wrap.c:2721: error: expected primary-expression before ‘namespace’ 
test_wrap.c:2721: error: expected `)' before ‘namespace’ 
test_wrap.c:2721: error: expected `)' before ‘;’ token 
test_wrap.c: In function ‘PyObject* Swig_var_ns_get()’: 
test_wrap.c:2733: error: expected primary-expression before ‘void’ 
test_wrap.c:2733: error: expected `)' before ‘void’ 
+0

Pouvez-vous poster la (les) partie (s) pertinente (s) du fichier généré test_wrap.c? Et notez que g ++ recherche par défaut les extensions de fichier pour déterminer dans quelle langue se trouve le fichier, donc test_wrap.c sera compilé en tant que code C, pas en C++. –

Répondre

12

Dans votre fichier test.i, ajoutez une ligne "using namespace ns" après #include. Sans cela, votre code swig wrapper ne saura pas chercher Foo dans l'espace de noms "ns".

+1

Qu'est-ce qu'un espace de noms se trouve dans un espace de noms, dans l'en-tête C++. Comment gérez-vous cela dans le fichier d'interface. Par exemple 'namespace school {namespace college {.... ....}}}' – nikk

+1

@nikk 'using namespace école :: college;', éventuellement avec 'using namespace school;' – JETM

Questions connexes