Доброго времени суток! Помогите пожалуйста решить одну (или две
проблему.
Вобщем откопал такую штуку, как swig, вроде бы неплохая вещь, но возникли некоторые трудности. Делаю всё, как в туториале на swig.org, ошибок никаких нет, но вот не могу обратиться к объявленой в сишном коде переменной и описаной там структуре. Функции при этом работают нормально.
Файл example.cxx:
/* File : example.c */
typedef struct V {
double x,y,z;
} v;
int add(int a, int b) {
return (a + b);
}
example.i:
/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
#define SWIG_FILE_WITH_INIT
extern int add(int a, int b);
extern struct v;
%}
extern struct v;
int add(int a, int b);
swig -c++ -python example.i \
&& g++ -fPIC -c example.cxx \
&& g++ -fPIC -c example_wrap.cxx -I/usr/local/include/python2.5 \
&& g++ -shared example.o example_wrap.o -o _example.so
Получаем:
swig -c++ -python example.i && g++ -fPIC -c example.cxx && g++ -fPIC -c example_wrap.cxx -I/usr/local/include/python2.5 && g++ -shared example.o example_wrap.o -o _example.so
example_wrap.cxx:2601: error: a storage class can only be specified for objects and functions
*** Error code 1
Если убрать "extern" в "extern struct v;" — то питон ругается:
>>> example.v()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'v'
Куда дальше копать — не знаю. Помогите, плиз...
Здравствуйте, lizz, Вы писали:
L>Доброго времени суток! Помогите пожалуйста решить одну (или две проблему.
L>Вобщем откопал такую штуку, как swig, вроде бы неплохая вещь, но возникли некоторые трудности. Делаю всё, как в туториале на swig.org, ошибок никаких нет, но вот не могу обратиться к объявленой в сишном коде переменной и описаной там структуре. Функции при этом работают нормально.
Сделай example.h со структурой и включай его в example.i
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, lizz, Вы писали:
L>>Доброго времени суток! Помогите пожалуйста решить одну (или две проблему.
L>>Вобщем откопал такую штуку, как swig, вроде бы неплохая вещь, но возникли некоторые трудности. Делаю всё, как в туториале на swig.org, ошибок никаких нет, но вот не могу обратиться к объявленой в сишном коде переменной и описаной там структуре. Функции при этом работают нормально.
FR>Сделай example.h со структурой и включай его в example.i
Можно по подробней... либо я не догоняю чего, либо не работает %).
example.h:
typedef struct V {
double x, y, z;
} v;
extern int add(int a, int b);
Инклюдю его в example.cxx и example.i:
/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}
extern int add(int a, int b);
В таком варианте тоже питон говорит, что нет example.v или example.V. Если добавить к структуре extern — то ругается gcc
.
Если кому интересней, решил так:
example.i:
/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
#define SWIG_FILE_WITH_INIT
int add(int a, int b);
struct V {
double x,y,z;
};
int t = 5;
%}
int t = 5;
struct V {
double x,y,z;
};
int add(int a, int b) {
return a + b;
}
Больше стурктура ни в каких файлах не упоминается, add так же прилось описать в example.cxx, так и не понял почему %). Подробней (но не подробно)) описал у себя в блоге, не сочтите за спам, линк в профиле.