Wrapping C++ class with SWIG, Mac OS X

P

Paul Anton Letnes

Hello guys,


(related to previous thread on wrapping C/C++ in Python, trying the
SWIG approach.)
Trying to map a C++ class to python, one method for now. Running the
following commands to "compile":

--------------------------------------
#!/usr/bin/env bash

MOD_NAME=Wavelet


swig -c++ -python -o ${MOD_NAME}_wrap.cpp ${MOD_NAME}.i

gcc -c++ -fPIC -c ${MOD_NAME}.cpp -o ${MOD_NAME}.o -I/usr/include/
python2.5 -I/usr/lib/python2.5

gcc -c++ -fPIC -c ${MOD_NAME}_wrap.cpp -o ${MOD_NAME}_wrap.o -I/usr/
include/python2.5 -I/usr/lib/python2.5

gcc -bundle -flat_namespace -undefined suppress -o _${MOD_NAME}.so $
{MOD_NAME}.o ${MOD_NAME}_wrap.o
--------------------------------------

The source code is:
--------------------------------------
Wavelet.h
--------------------------------------
#ifndef _WAVELET_H_
#define _WAVELET_H_

#include <iostream>
#include <vector>

using namespace std;

class Wavelet
{

public:
Wavelet(vector<double> theV);
~Wavelet();
vector<double> GetDaub4Trans();

private:
vector<double> v;

};


#endif /*_WAVELET_H_*/
--------------------------------------
and Wavelet.cpp:
--------------------------------------
#include "wavelet.h"

Wavelet::Wavelet(vector<double> theV)
{
this->v = theV;
}

Wavelet::~Wavelet()
{
// Nothing for now
}

vector<double> Wavelet::GetDaub4Trans()
{
vector<double> retV = vector<double>();
retV.push_back(3.14);
retV.push_back(2.71);
retV.push_back(1.62);
return retV;
// just to test the approach - everything in here I can fix later.
}
--------------------------------------
This seems to compile, but in python I get:
--------------------------------------
$ python
imPython 2.5.2 (r252:60911, Mar 30 2008, 22:49:33)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "Wavelet.py", line 7, in <module>
import _Wavelet
ImportError: dlopen(./_Wavelet.so, 2): Symbol not found:
__ZNKSt11logic_error4whatEv
Referenced from: /Users/paul/Desktop/Wavelet_SWIG_Cpp/_Wavelet.so
Expected in: flat namespace
--------------------------------------

Any ideas or tips? SWIG seems very nice for simple C methods where you
pass an int and return an int, but I can't seem to figure out the
syntaxes etc for more complicated stuff - arrays, vector<T>, C++, ...
Appreciate any help!


Cheers,
Paul.
 
D

Diez B. Roggisch

Paul said:
Hello guys,


(related to previous thread on wrapping C/C++ in Python, trying the SWIG
approach.)
Trying to map a C++ class to python, one method for now. Running the
following commands to "compile":

--------------------------------------
#!/usr/bin/env bash

MOD_NAME=Wavelet


swig -c++ -python -o ${MOD_NAME}_wrap.cpp ${MOD_NAME}.i

gcc -c++ -fPIC -c ${MOD_NAME}.cpp -o ${MOD_NAME}.o
-I/usr/include/python2.5 -I/usr/lib/python2.5

gcc -c++ -fPIC -c ${MOD_NAME}_wrap.cpp -o ${MOD_NAME}_wrap.o
-I/usr/include/python2.5 -I/usr/lib/python2.5

gcc -bundle -flat_namespace -undefined suppress -o _${MOD_NAME}.so
${MOD_NAME}.o ${MOD_NAME}_wrap.o
--------------------------------------

The source code is:
--------------------------------------
Wavelet.h
--------------------------------------
#ifndef _WAVELET_H_
#define _WAVELET_H_

#include <iostream>
#include <vector>

using namespace std;

class Wavelet
{

public:
Wavelet(vector<double> theV);
~Wavelet();
vector<double> GetDaub4Trans();

private:
vector<double> v;

};


#endif /*_WAVELET_H_*/
--------------------------------------
and Wavelet.cpp:
--------------------------------------
#include "wavelet.h"

Wavelet::Wavelet(vector<double> theV)
{
this->v = theV;
}

Wavelet::~Wavelet()
{
// Nothing for now
}

vector<double> Wavelet::GetDaub4Trans()
{
vector<double> retV = vector<double>();
retV.push_back(3.14);
retV.push_back(2.71);
retV.push_back(1.62);
return retV;
// just to test the approach - everything in here I can fix later.
}
--------------------------------------
This seems to compile, but in python I get:
--------------------------------------
$ python
imPython 2.5.2 (r252:60911, Mar 30 2008, 22:49:33)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "Wavelet.py", line 7, in <module>
import _Wavelet
ImportError: dlopen(./_Wavelet.so, 2): Symbol not found:
__ZNKSt11logic_error4whatEv
Referenced from: /Users/paul/Desktop/Wavelet_SWIG_Cpp/_Wavelet.so
Expected in: flat namespace
--------------------------------------

Any ideas or tips? SWIG seems very nice for simple C methods where you
pass an int and return an int, but I can't seem to figure out the
syntaxes etc for more complicated stuff - arrays, vector<T>, C++, ...
Appreciate any help!

Can't help on SWIG - all I can say is that SIP which is used to wrap the
large and template-ridden C++-GUI-Toolkit Qt worked flawlessly for me.
Maybe you should try that.

Diez
 
P

Paul Anton Letnes

Okay, installed SIP. Looks promising, following the tutorial on
http://www.riverbankcomputing.com/static/Docs/sip4/sipref.html#using-sip
It should be noted that I am working on a Mac - I know there are some
differences, but it's still UNIX and should work somehow.

Anyway, I copy-paste and create the Word.h header, write an
implementation in Word.cpp, the SIP wrapper Word.sip and the
configure.py script. I now run configure and make, creating the
following error:

~/Desktop/SIP_example $ python configure.py
~/Desktop/SIP_example $ make
c++ -c -pipe -fPIC -Os -Wall -W -I. -I/sw/include/python2.5 -o
sipwordcmodule.o sipwordcmodule.cpp
c++ -c -pipe -fPIC -Os -Wall -W -I. -I/sw/include/python2.5 -o
sipwordWord.o sipwordWord.cpp
c++ -headerpad_max_install_names -bundle -undefined dynamic_lookup -o
word.so sipwordcmodule.o sipwordWord.o -lword
ld: library not found for -lword
collect2: ld returned 1 exit status
make: *** [word.so] Error 1
~/Desktop/SIP_example $

SWIG at least works nicely with C... Too bad I know so little about
compilers and libraries, I don't quite understand what the linker (ld)
is complaining about. The simplest tutorial should anyway work?


Cheers
Paul.
 
D

Diez B. Roggisch

Paul said:
Okay, installed SIP. Looks promising, following the tutorial on
http://www.riverbankcomputing.com/static/Docs/sip4/sipref.html#using-sip
It should be noted that I am working on a Mac - I know there are some
differences, but it's still UNIX and should work somehow.

Anyway, I copy-paste and create the Word.h header, write an
implementation in Word.cpp, the SIP wrapper Word.sip and the
configure.py script. I now run configure and make, creating the
following error:

~/Desktop/SIP_example $ python configure.py
~/Desktop/SIP_example $ make
c++ -c -pipe -fPIC -Os -Wall -W -I. -I/sw/include/python2.5 -o
sipwordcmodule.o sipwordcmodule.cpp
c++ -c -pipe -fPIC -Os -Wall -W -I. -I/sw/include/python2.5 -o
sipwordWord.o sipwordWord.cpp
c++ -headerpad_max_install_names -bundle -undefined dynamic_lookup -o
word.so sipwordcmodule.o sipwordWord.o -lword
ld: library not found for -lword
collect2: ld returned 1 exit status
make: *** [word.so] Error 1
~/Desktop/SIP_example $

SWIG at least works nicely with C... Too bad I know so little about
compilers and libraries, I don't quite understand what the linker (ld)
is complaining about. The simplest tutorial should anyway work?

Not knowing C/C++ & linking is certainly something that will get you
when trying to wrap libs written in these languages.

I'm on OSX myself, and can say that as a unixish system, it is rather
friendly to self-compliation needs.

However, without having the complete sources & libs, I can't really
comment much - the only thing that is clear from above is that the
linker does not find the file

libword.dylib

which you of course need to have somewhere. The good news is that once
you've teached the linker where to find it (using LDFLAGS or other
means) you are (modulo debugging) done - SIP has apparently grokked your
..sip-file.

Of course you also must make the library available at runtime. So it
must be installed on a location (or that location given with
DYLD_LIBRARY_PATH) where the dynamic loader will find it.

Diez
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,968
Messages
2,570,149
Members
46,695
Latest member
StanleyDri

Latest Threads

Top