У меня возникли проблемы с получением следующего простого примера для работы с SWIG 1.3.40 (и я также пробовал 1.3.31). Структура Foo возникает как модуль Python, если я не переношу его в пространство имен, но как только я это сделаю, я получаю ошибку компиляции в сгенерированном test_wrap.c.SWIG - проблема с пространствами имен
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"
я выполнить следующие команды для построения расслоением на 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
Это работает, но только если я выберу пространство имен. Хотя SWIG обрабатывал пространства имен автоматически в простых случаях, подобных этому. Что я делаю не так?
Это ошибка, которую я получаю - похоже, SWIG ссылается на символ «ns» и «namespace», которые не определены.
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’
Можете ли вы разместить соответствующую часть (и) сгенерированного файла test_wrap.c? И обратите внимание, что g ++ по умолчанию по умолчанию ищет расширения файлов, чтобы определить, на каком языке находится файл, поэтому test_wrap.c будет скомпилирован как код C, а не как C++. –