C Function Pointer Wrapping Example not working

Charlie Charlie.Xia.FDU at gmail.com
Sun Nov 16 21:56:40 EST 2008


>
> >  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
---------------------------------



More information about the Python-list mailing list