473,321 Members | 1,778 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,321 software developers and data experts.

Wrapping C++ class with SWIG, Mac OS X

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
3 5577
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
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
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 thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

13
by: Roy Smith | last post by:
I've got a C library with about 50 calls in it that I want to wrap in Python. I know I could use some tool like SWIG, but that will give me a too-literal translation; I want to make some...
6
by: Andrew Wilkinson | last post by:
Hi, I'm trying to wrap a C++ class hierarchy with Python types and I'd like to maintain the hierarchy in the types. I'm fairly sure this is possible, isn't it? Are there any documents...
2
by: Glenn Pierce | last post by:
Hi I have been trying to wrap a c library called FreeImage for python and am having trouble with a couple of functions. One function is FreeImage_Load which takes parameters (enum, const...
0
by: James Carroll | last post by:
Hi, I asked this on the SWIG mailing list, but it's pretty dead over there.... I'm trying to get Python to pass a subclass of a C++ object to another C++ object... I have three C++ classes, ...
0
by: Paul Anton Letnes | last post by:
>
1
by: Stodge | last post by:
Yet another SWIG question (YASQ!). I'm having a problem with using an abstract base class. When generating the Python bindings, SWIG thinks that all the concrete classes that derive from this...
6
by: Adam C. | last post by:
We have a situation where we want a Swig-generated Python class to have a different base (not object). It doesn't appear that we can coerce Swig into generating the class we want at present (but we...
8
by: Anish Chapagain | last post by:
Hi!! I tried wrapping a simple C code suing SWIG to Python, but am having problem, my .c file is, Step 1: example.c -------------- double val=3.0; int fact(int n)
5
by: Charlie | last post by:
Hi All, I am new to using swig/C++/python. I got some problem with function pointers. I posted in swig-user, but got no response. So I forwarded it here. You help is greatly appreciated. ...
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
1
by: Defcon1945 | last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
0
by: af34tf | last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.