By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
458,187 Members | 1,629 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 458,187 IT Pros & Developers. It's quick & easy.

Wrapping C++ class with SWIG, Mac OS X

P: n/a
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<doubletheV);
~Wavelet();
vector<doubleGetDaub4Trans();

private:
vector<doublev;

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

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

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

vector<doubleWavelet::GetDaub4Trans()
{
vector<doubleretV = 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.
>>import Wavelet
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.
Jun 27 '08 #1
Share this Question
Share on Google+
3 Replies


P: n/a
Paul Anton Letnes schrieb:
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<doubletheV);
~Wavelet();
vector<doubleGetDaub4Trans();

private:
vector<doublev;

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

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

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

vector<doubleWavelet::GetDaub4Trans()
{
vector<doubleretV = 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.
>>import Wavelet
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
Jun 27 '08 #2

P: n/a
Okay, installed SIP. Looks promising, following the tutorial on
http://www.riverbankcomputing.com/st...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.

>
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
--
http://mail.python.org/mailman/listinfo/python-list
Jun 27 '08 #3

P: n/a
Paul Anton Letnes schrieb:
Okay, installed SIP. Looks promising, following the tutorial on
http://www.riverbankcomputing.com/st...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
Jun 27 '08 #4

This discussion thread is closed

Replies have been disabled for this discussion.