C Function Pointer Wrapping Example not working

Aaron Brady castironpi at gmail.com
Mon Nov 17 03:18:00 EST 2008


On Nov 16, 8:56 pm, Charlie <Charlie.Xia.... at gmail.com> wrote:
> > >  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.
> ------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
> ----------------------------------

Hi Charlie,

I think you're overcomplicating.  Here's what I think what you want:
(Unproduced.)

>>> binary_op( 3, 4, myadd )
7
>>> binary_op( 3, 4, mysub )
-1
>>> binary_op( 3, 4, mymul )
12

Correct?



More information about the Python-list mailing list