저는 swig로 감싸이고 파이썬에서 사용하는 C++ 코드를 가지고 있습니다. C++ 코드 안에 콜백 파이썬 코드를 실행하는 방법을 만들고 싶습니다. 그래서 "추상"클래스를 만들었습니다. (아직 추상화되지 않았습니다.) 그리고 .i 파일 내부에서 C++로 서브 라이징하고 있습니다. 여기 swig를 사용하여 상속 C++에서 오류가 발생했습니다.
는%feature("director") PyListener;
using namespace std;
%{
#include "../core/listener.h"
%}
%include "../core/listener.h"
class PyListener : public Listener {
PyObject * function;
public:
PyListener() {};
PyListener(PyObject * func) : function(func) {};
void register_new() {Py_XINCREF(function);};
~PyListener() {Py_XDECREF(function);};
void run(Msg &m) {
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
PyObject *pValue = PyCObject_FromVoidPtr((void*)&m,NULL);
PyObject *pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, pValue);
PyObject_CallObject(function, pArgs);
PyGILState_Release(gstate);
};
};
하지만 컴파일하는 동안
는 당신 때문에/bin/sh ../../libtool --tag=CXX --mode=compile g++ -DHAVE_CONFIG_H -I. -I../.. -I. -I./../core -I./../../../include -I/opt/regression/usr/include/ -I./../../include_dep/ -I/usr/include/python2.6 -fPIC -g -O2 -MT sim_wrap.lo -MD -MP -MF .deps/sim_wrap.Tpo -c -o sim_wrap.lo sim_wrap.cxx
libtool: compile: g++ -DHAVE_CONFIG_H -I. -I../.. -I. -I./../core -I./../../../include -I/opt/regression/usr/include/ -I./../../include_dep/ -I/usr/include/python2.6 -fPIC -g -O2 -MT sim_wrap.lo -MD -MP -MF .deps/sim_wrap.Tpo -c sim_wrap.cxx -fPIC -DPIC -o .libs/sim_wrap.o
sim_wrap.cxx: In function ‘PyObject* _wrap_new_PyListener__SWIG_0(PyObject*, PyObject*)’:
sim_wrap.cxx:36391: error: ‘PyListener’ was not declared in this scope
sim_wrap.cxx:36391: error: ‘result’ was not declared in this scope
sim_wrap.cxx:36394: error: expected primary-expression before ‘)’ token
sim_wrap.cxx:36394: error: expected ‘;’ before ‘new’
...
이 시스템에'python-dev' /'python-devel' 패키지가 설치되어 있습니까? –
물론이 리스너 부분을 제거하면 다른 swig 함수를 컴파일하고 사용할 수 있습니다. –