> > > But when I try to import test in python, it complains: > > import _test > > ImportError: ./_test.so undefined symbol: _Z9binary_opiiPFiiiE > > The above is a mangled name so you've got some C vs C++ problems I'd > say. > > You could try putting some extern "C" {} in around all the functions > which are imported and exported. Have a look at the code SWIG > generates and see if it puts some extern "C" in and match what it > does in your code. > > We used to use SWIG in for python embedding in our C++ project, but we > found that using ctypes is a lot easier. You just write C .so/.dll > and use ctypes to access them. You can do callbacks and embedding > python like this too.
Thanks Nick. I tried your method, if I am right(please see the attached details), and I still got the undefined symbol error like previous. The only difference is "_Z9binary_opiiPFiiiE" changed to "binary_op". Could you help me more on this. It seems to have a mixed problems here and I guess what you've pointed out is one of them. But really, what I do now is just try to reproduce the example, how can this fails? What my ultimate need is wrapping up a template function taking template function pointer as argument. Did you ever try that? Many thanks already anyway. FILE and ERROR details: ---------test.i-------------- %module test %{ #include "test.h" %} %include "test.h" %callback("%s_cb"); int myadd( int, int ); //myadd_cb int mysub( int, int ); //mysub_cb int mymul( int, int ); //mymul_cb %nocallback; -------------------------------- -----------test.h-------------- extern "C"{ int binary_op(int a, int b, int (*op)(int,int) ); int myadd( int a, int b ) { return a+b; }; int mysub( int a, int b ) { return a-b; }; int mymul( int a, int b ) { return a*b; }; } --------------------------------- ------error message---------- Traceback (most recent call last): File "<stdin>", line 1, in <module> File "test.py", line 7, in <module> import _test ImportError: ./_test.so: undefined symbol: binary_op ---------------------------------- -------compiling message----- swig -v -python -c++ -o test_wrap.cpp test.i LangSubDir: python Search paths: ./ ./swig_lib/python/ /usr/local/share/swig/1.3.36/python/ ./swig_lib/ /usr/local/share/swig/1.3.36/ Preprocessing... Starting language-specific parse... Processing types... C++ analysis... Generating wrappers... python setup-test.py build running build running build_py copying test.py -> build/lib.linux-i686-2.5 running build_ext building '_test' extension gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall - Wstrict-prototypes -fPIC -I/usr/include/python2.5 -c test_wrap.cpp -o build/temp.linux-i686-2.5/test_wrap.o cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++ g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux- i686-2.5/test_wrap.o build/temp.linux-i686-2.5/test.o -o build/ lib.linux-i686-2.5/_test.so --------------------------------- -- http://mail.python.org/mailman/listinfo/python-list