From: Bryan B. <ka...@gm...> - 2010-08-14 22:05:51
|
Hey all, I am wrapping openNURBS for python consumption and want to fix some undefined symbols, which seem to be traced back to the _wrap.cxx file (the symbols aren't used in the wrapped library as far as I can tell). My work flow is as follows: swig -classic -cpperraswarn -c++ -python opennurbs.i gcc -c ../opennurbs/*.cpp opennurbs_wrap.cxx -I/usr/include/python2.5/ -I/usr/lib/python2.5/ -L. -lstdc++ -lpython2.5 -lopenNURBS -lGLU -lGL -lglut -lXmu -lXi -lXext -lX11 2>&1 gcc -z defs -shared libopenNURBS.a opennurbs_wrap.o -L. -lstdc++ -lpython2.5 -lopenNURBS -lGLU -lGL -lglut -lXmu -lXi -lXext -lX11 -o _opennurbs.so ldd -r _opennurbs.so When I run the ldd -r line I get this back: undefined symbol: _ZNK16ON_UuidIndexList5WriteER16ON_BinaryArchive (./_opennurbs.so) undefined symbol: _ZN16ON_UuidIndexList4ReadER16ON_BinaryArchive (./_opennurbs.so) undefined symbol: _Z26ON_BinarySearchDoubleArraydPKdj (./_opennurbs.so) undefined symbol: _Z23ON_IsShortChunkTypecodej (./_opennurbs.so) undefined symbol: _ZN12ON_NurbsCage10InsertKnotEidi (./_opennurbs.so) This is bad because when I load the module in python it complains about the undefined symbols too: >>> import opennurbs Traceback (most recent call last): File "<input>", line 1, in <module> File "./opennurbs.py", line 7, in <module> import _opennurbs ImportError: ./_opennurbs.so: undefined symbol: _ZNK16ON_UuidIndexList5WriteER16ON_BinaryArchive When I run gcc with -z defs (when compiling _opennurbs.so) I get this back: opennurbs_wrap.o: In function `_wrap_ON_UuidIndexList_Write': opennurbs_wrap.cxx:(.text+0xafe39): undefined reference to `ON_UuidIndexList::Write(ON_BinaryArchive&) const' opennurbs_wrap.o: In function `_wrap_ON_UuidIndexList_Read': opennurbs_wrap.cxx:(.text+0xaffcf): undefined reference to `ON_UuidIndexList::Read(ON_BinaryArchive&)' opennurbs_wrap.o: In function `_wrap_ON_BinarySearchDoubleArray': opennurbs_wrap.cxx:(.text+0x149d6c): undefined reference to `ON_BinarySearchDoubleArray(double, double const*, unsigned int)' opennurbs_wrap.o: In function `_wrap_ON_IsShortChunkTypecode': opennurbs_wrap.cxx:(.text+0x167f47): undefined reference to `ON_IsShortChunkTypecode(unsigned int)' opennurbs_wrap.o: In function `_wrap_ON_NurbsCage_InsertKnot__SWIG_0': opennurbs_wrap.cxx:(.text+0x313011): undefined reference to `ON_NurbsCage::InsertKnot(int, double, int)' opennurbs_wrap.o: In function `_wrap_ON_NurbsCage_InsertKnot__SWIG_1': opennurbs_wrap.cxx:(.text+0x3131cc): undefined reference to `ON_NurbsCage::InsertKnot(int, double, int)' So, somewhere in opennurbs_wrap.cxx I have the following definitions that I want to get rid of (presumably by modifying opennurbs.i): SWIGINTERN PyObject *_wrap_ON_UuidIndexList_Write(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { SWIGINTERN PyObject *_wrap_ON_UuidIndexList_Read(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { SWIGINTERN PyObject *_wrap_ON_BinarySearchDoubleArray(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { SWIGINTERN PyObject *_wrap_ON_IsShortChunkTypecode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { SWIGINTERN PyObject *_wrap_ON_NurbsCage_InsertKnot__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { SWIGINTERN PyObject *_wrap_ON_NurbsCage_InsertKnot__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { So I tried %ignore in the interface file: %ignore ON_UuidndexList::Write(ON_BinaryArchive&); %ignore ON_UuidIndexList::Read(ON_BinaryArchive&); %ignore ON_BinarySearchDoubleArray(double, double const*, unsigned int); %ignore ON_IsShortChunkTypecode(unsigned int); .. but none of those statements seemed to modify the resulting opennurbs_wrap.cxx file. :-( What's also odd is that I did a %ignore line for something else that had this same form factor in the output, and in the _wrap.cxx file it did not appear. I don't know why. Anyway, I am primarily wondering how to get rid of certain generated elements in _wrap.cxx without manually modifying or modifying-with-seds the wrapper in C++. Are there tricks other than %ignore? Thanks for the tips, - Bryan http://heybryan.org/ 1 512 203 0507 (btw I am also on irc.freenode.net in #swig-wrapper) |
From: William S F. <ws...@fu...> - 2010-08-17 21:38:08
|
Bryan Bishop wrote: > Hey all, > > I am wrapping openNURBS for python consumption and want to fix some > undefined symbols, which seem to be traced back to the _wrap.cxx file > (the symbols aren't used in the wrapped library as far as I can tell). > My work flow is as follows: > > swig -classic -cpperraswarn -c++ -python opennurbs.i > gcc -c ../opennurbs/*.cpp opennurbs_wrap.cxx -I/usr/include/python2.5/ > -I/usr/lib/python2.5/ -L. -lstdc++ -lpython2.5 -lopenNURBS -lGLU -lGL > -lglut -lXmu -lXi -lXext -lX11 2>&1 > gcc -z defs -shared libopenNURBS.a opennurbs_wrap.o -L. -lstdc++ > -lpython2.5 -lopenNURBS -lGLU -lGL -lglut -lXmu -lXi -lXext -lX11 -o > _opennurbs.so > ldd -r _opennurbs.so > > When I run the ldd -r line I get this back: > > undefined symbol: > _ZNK16ON_UuidIndexList5WriteER16ON_BinaryArchive (./_opennurbs.so) > undefined symbol: > _ZN16ON_UuidIndexList4ReadER16ON_BinaryArchive (./_opennurbs.so) > undefined symbol: _Z26ON_BinarySearchDoubleArraydPKdj (./_opennurbs.so) > undefined symbol: _Z23ON_IsShortChunkTypecodej (./_opennurbs.so) > undefined symbol: _ZN12ON_NurbsCage10InsertKnotEidi (./_opennurbs.so) > > This is bad because when I load the module in python it complains > about the undefined symbols too: >>>> import opennurbs > Traceback (most recent call last): > File "<input>", line 1, in <module> > File "./opennurbs.py", line 7, in <module> > import _opennurbs > ImportError: ./_opennurbs.so: undefined symbol: > _ZNK16ON_UuidIndexList5WriteER16ON_BinaryArchive > > When I run gcc with -z defs (when compiling _opennurbs.so) I get this back: > > opennurbs_wrap.o: In function `_wrap_ON_UuidIndexList_Write': > opennurbs_wrap.cxx:(.text+0xafe39): undefined reference to > `ON_UuidIndexList::Write(ON_BinaryArchive&) const' > opennurbs_wrap.o: In function `_wrap_ON_UuidIndexList_Read': > opennurbs_wrap.cxx:(.text+0xaffcf): undefined reference to > `ON_UuidIndexList::Read(ON_BinaryArchive&)' > opennurbs_wrap.o: In function `_wrap_ON_BinarySearchDoubleArray': > opennurbs_wrap.cxx:(.text+0x149d6c): undefined reference to > `ON_BinarySearchDoubleArray(double, double const*, unsigned int)' > opennurbs_wrap.o: In function `_wrap_ON_IsShortChunkTypecode': > opennurbs_wrap.cxx:(.text+0x167f47): undefined reference to > `ON_IsShortChunkTypecode(unsigned int)' > opennurbs_wrap.o: In function `_wrap_ON_NurbsCage_InsertKnot__SWIG_0': > opennurbs_wrap.cxx:(.text+0x313011): undefined reference to > `ON_NurbsCage::InsertKnot(int, double, int)' > opennurbs_wrap.o: In function `_wrap_ON_NurbsCage_InsertKnot__SWIG_1': > opennurbs_wrap.cxx:(.text+0x3131cc): undefined reference to > `ON_NurbsCage::InsertKnot(int, double, int)' > > So, somewhere in opennurbs_wrap.cxx I have the following definitions > that I want to get rid of (presumably by modifying opennurbs.i): > > SWIGINTERN PyObject *_wrap_ON_UuidIndexList_Write(PyObject > *SWIGUNUSEDPARM(self), PyObject *args) { > SWIGINTERN PyObject *_wrap_ON_UuidIndexList_Read(PyObject > *SWIGUNUSEDPARM(self), PyObject *args) { > SWIGINTERN PyObject *_wrap_ON_BinarySearchDoubleArray(PyObject > *SWIGUNUSEDPARM(self), PyObject *args) { > SWIGINTERN PyObject *_wrap_ON_IsShortChunkTypecode(PyObject > *SWIGUNUSEDPARM(self), PyObject *args) { > SWIGINTERN PyObject *_wrap_ON_NurbsCage_InsertKnot__SWIG_0(PyObject > *SWIGUNUSEDPARM(self), PyObject *args) { > SWIGINTERN PyObject *_wrap_ON_NurbsCage_InsertKnot__SWIG_1(PyObject > *SWIGUNUSEDPARM(self), PyObject *args) { > > So I tried %ignore in the interface file: > > %ignore ON_UuidndexList::Write(ON_BinaryArchive&); > %ignore ON_UuidIndexList::Read(ON_BinaryArchive&); > %ignore ON_BinarySearchDoubleArray(double, double const*, unsigned int); > %ignore ON_IsShortChunkTypecode(unsigned int); > .. but none of those statements seemed to modify the resulting > opennurbs_wrap.cxx file. :-( > > What's also odd is that I did a %ignore line for something else that > had this same form factor in the output, and in the _wrap.cxx file it > did not appear. I don't know why. Anyway, I am primarily wondering how > to get rid of certain generated elements in _wrap.cxx without manually > modifying or modifying-with-seds the wrapper in C++. Are there tricks > other than %ignore? > You probably aren't using %ignore correctly. Make sure the %ignore is before SWIG parses the definition of the symbol. Also look at this: $ c++filt _ZNK16ON_UuidIndexList5WriteER16ON_BinaryArchive ON_UuidIndexList::Write(ON_BinaryArchive&) const You are missing the const in your %ignore. Also you can use %ignore without the parameter list, eg: %ignore ON_UuidndexList::Write William |
From: Bryan B. <ka...@gm...> - 2010-08-20 06:03:02
|
On Tue, Aug 17, 2010 at 4:14 PM, William S Fulton wrote: > You are missing the const in your %ignore. Also you can use %ignore without > the parameter list, eg: > > %ignore ON_UuidndexList::Write Thank you, that fixed my problems. Another issue has cropped up, but I don't know if I want to pose the question to the list just yet. One of the openNURBS methods (ON_GL) takes a gluNurbsObj pointer as the second parameter. When I import opennurbs in python, I also impot PyOpenGL, which uses ctypes/libffi to pass things around. The swig-generated wrapper doesn't seem to recognize the ctypes-wrapped gluNurbsObj as being a gluNurbsObj, so for now I've manually hacked the wrapper up so that it doesn't do type checking on the second parameter. More generally, I could just switch the second parameter in the openNURBS source to be a pointer to some void. But maybe there's a more elegant way to handle this sort of situation where I'm passing objects from ctypes to a swig-wrapped function or something. And if not, it's not much of a huge deal since the "rewrite it with a void pointer" strategy will probably work. Thanks William, Josh and Eric :-). - Bryan http://heybryan.org/ 1 512 203 0507 |
From: Josh C. <jc...@nc...> - 2010-08-18 02:28:26
|
On Sat, 14 Aug 2010, Bryan Bishop wrote: > I am wrapping openNURBS for python consumption and want to fix some > undefined symbols, which seem to be traced back to the _wrap.cxx file > (the symbols aren't used in the wrapped library as far as I can tell). > My work flow is as follows: > > swig -classic -cpperraswarn -c++ -python opennurbs.i > gcc -c ../opennurbs/*.cpp opennurbs_wrap.cxx -I/usr/include/python2.5/ > -I/usr/lib/python2.5/ -L. -lstdc++ -lpython2.5 -lopenNURBS -lGLU -lGL > -lglut -lXmu -lXi -lXext -lX11 2>&1 > gcc -z defs -shared libopenNURBS.a opennurbs_wrap.o -L. -lstdc++ > -lpython2.5 -lopenNURBS -lGLU -lGL -lglut -lXmu -lXi -lXext -lX11 -o > _opennurbs.so > ldd -r _opennurbs.so > > When I run the ldd -r line I get this back: > > undefined symbol: > _ZNK16ON_UuidIndexList5WriteER16ON_BinaryArchive (./_opennurbs.so) I would have guessed that those symbols are what the library provides. Usually missing symbols mean that you need change your link line. I'm not sure why you have libopenNURBS.a in addition to -lopenNURBS. Having libopenNURBS.a before opennurbs_wrap.o might be the problem. Josh |
From: Eric Prud'h. <er...@w3...> - 2010-08-18 08:18:19
|
* Josh Cherry <jc...@nc...> [2010-08-17 22:28-0400] > > > On Sat, 14 Aug 2010, Bryan Bishop wrote: > > > I am wrapping openNURBS for python consumption and want to fix some > > undefined symbols, which seem to be traced back to the _wrap.cxx file > > (the symbols aren't used in the wrapped library as far as I can tell). > > My work flow is as follows: > > > > swig -classic -cpperraswarn -c++ -python opennurbs.i > > gcc -c ../opennurbs/*.cpp opennurbs_wrap.cxx -I/usr/include/python2.5/ > > -I/usr/lib/python2.5/ -L. -lstdc++ -lpython2.5 -lopenNURBS -lGLU -lGL > > -lglut -lXmu -lXi -lXext -lX11 2>&1 > > gcc -z defs -shared libopenNURBS.a opennurbs_wrap.o -L. -lstdc++ > > -lpython2.5 -lopenNURBS -lGLU -lGL -lglut -lXmu -lXi -lXext -lX11 -o > > _opennurbs.so > > ldd -r _opennurbs.so > > > > When I run the ldd -r line I get this back: > > > > undefined symbol: > > _ZNK16ON_UuidIndexList5WriteER16ON_BinaryArchive (./_opennurbs.so) Make sure the symbol is located in e.g. one of your .o files: for f in *.o; do echo $f && objump -t $f | grep _ZNK16ON_UuidIndexList5WriteER16ON_BinaryArchive; done Here's an annotated example of me looking for some symbol: eric@ubu:~/checkouts/swobjects/bin$ for f in ../lib/RdfDB.o ../lib/ResultSet.o; do echo $f && objdump -t $f | grep _ZN6w3c_sw5RdfDB13bindVariablesEPNS_9ResultSetEPKNS_5TTermEPKNS_17BasicGraphPatternE; done ../lib/ParserCommon.o ../lib/RdfQueryDB.o 00000000 *UND* 00000000 _ZN6w3c_sw5RdfDB13bindVariablesEPNS_9ResultSetEPKNS_5TTermEPKNS_17BasicGraphPatternE ../lib/RdfDB.o 00001608 g F .text 00000511 _ZN6w3c_sw5RdfDB13bindVariablesEPNS_9ResultSetEPKNS_5TTermEPKNS_17BasicGraphPatternE ../lib/ResultSet.o It's undefined (*UND*) in RdfQueryDB.o; but at offset 1608 in RdfDB.o. Let's find out what the real function name is: eric@ubu:~/checkouts/swobjects/bin$ objdump -C -t ../lib/RdfDB.o | grep ^00001608 00001608 g F .text 00000511 w3c_sw::RdfDB::bindVariables(w3c_sw::ResultSet*, w3c_sw::TTerm const*, w3c_sw::BasicGraphPattern const*) > I would have guessed that those symbols are what the library provides. > Usually missing symbols mean that you need change your link line. I'm not > sure why you have libopenNURBS.a in addition to -lopenNURBS. Having > libopenNURBS.a before opennurbs_wrap.o might be the problem. While you're trying to understand the problem, don't be afraid to include -lopenNURBS multiple times in the link invocation. A link invocation of -lfoo -lbar -lfoo allows the linker to resolve foofunc1, which references barfunc1, which in turn references foofunc2. Such circularity is rare, but it's still a useful strategy to double your link line and whittle it back to the minimum. > Josh > > > ------------------------------------------------------------------------------ > This SF.net email is sponsored by > > Make an app they can't live without > Enter the BlackBerry Developer Challenge > http://p.sf.net/sfu/RIM-dev2dev > _______________________________________________ > Swig-user mailing list > Swi...@li... > https://lists.sourceforge.net/lists/listinfo/swig-user -- -ericP |