2010-09-12 3 views
3

У меня возникли проблемы с получением следующего простого примера для работы с 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’ 
+0

Можете ли вы разместить соответствующую часть (и) сгенерированного файла test_wrap.c? И обратите внимание, что g ++ по умолчанию по умолчанию ищет расширения файлов, чтобы определить, на каком языке находится файл, поэтому test_wrap.c будет скомпилирован как код C, а не как C++. –

ответ

12

В файле test.i добавьте строку «using namespace ns» после #include. Без этого ваш код оболочки swig не будет знать, чтобы искать Foo в пространстве имен ns.

+1

Что такое пространство имен внутри пространства имен в заголовке C++. Как вы справляетесь с этим в файле интерфейса. Например, 'namespace school {namespace college {.... .... ....}}' – nikk

+1

@nikk 'с использованием школы пространства имен :: college;', возможно, вместе с 'использованием школы пространства имен;' – JETM

Смежные вопросы