From: Johan H. <ha...@si...> - 2011-09-22 03:09:35
|
On Wednesday September 21 2011 17:16:09 Kyle Gorman wrote: > I use Python for all kinds of high-level projects, but also often > write C for fast low-level stuff. Unlike the rest of Python, the C > integration is not so well documented, so I was hoping I could use > SWIG (this is my first attempt) to quickly create a Python module > wrapping around a C function. The function is: > > <swipe.c> > vector swipe(char wav[], double min, double max, double st, double dt); > </swipe.c> > > , where vector just is: > > <vector.h> > typedef struct { int x; double* v; } vector; > </vector.h> > > What I'd like is to be able to call this function from Python and get > back some kind of ordered list/container of floating-point numbers. > But I can't even get to the point of dealing with that. > > First, I set up swipe.i and ran SWIG. > > <swipe.i> > %module swipe > %{ > #define SWIG_FILE_WITH_INIT > #include "swipe.h" > %} > vector swipe(char wav[], double min, double max, double st, double dt); > </swipe.i> > > (I'm not convinced I understand the #define, but I just went at it). > > $ swig -python swipe.i > > Then I created setup.py and compiled. Try this file: <setup.py> #!/usr/bin/env python from distutils.core import setup, Extension setup(name='swipe', version='1.2', author='Kyle Gorman', description="""SWIPE' pitch estimator""", py_modules=['swipe'], ext_modules=[Extension('_swipe', sources=['swipe.c', 'swipe_wrap.c'], libraries=['sndfile'])]) </setup.py> > $ python setup.py build_ext --inplace > > None of that generated any errors. But I can't import the module. > > $ python -m swipe > ...[traceback omitted]... > ImportError: /home/kgorman/Dropbox/Code/swipe/_swipe.so: undefined > symbol: sf_close > > "sf_close" is a C function from libsndfile, and swipe.c #includes > <sndfile.h>. The docs say such an error "usually indicates that you > forgot to include some object files or libraries in the linking of the > shared library file. Make sure you compile both the SWIG wrapper file > and your original program into a shared library file. Make sure you > pass all of the required libraries to the linker." > > Well, I wasn't really worried about the linker finding sndfile.h: it's > in /usr/include/. So, I thought, perhaps if I added "#include > <sndfile.h>" to swipe.i, it would find what I wanted, but I got the > same error. Can anyone direct me how to get sf_close (and the rest of > sndfile.h) into the resulting _swipe.so? Presumably there's something > different I need to do to satisfy the doc's "make sure"s, but I simply > don't know what. The compiler probably finds sndfile.h but the linker needs the library. Johan > Thanks all, > K > > PS: The same outcome happened when I compiled by hand and with > "-I/usr/include". > > --------------------------------------------------------------------------- > --- All the data continuously generated in your IT infrastructure contains > a definitive record of customers, application performance, security > threats, fraudulent activity and more. Splunk takes this data and makes > sense of it. Business sense. IT sense. Common sense. > http://p.sf.net/sfu/splunk-d2dcopy1 > _______________________________________________ > Swig-user mailing list > Swi...@li... > https://lists.sourceforge.net/lists/listinfo/swig-user |