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’
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++. –