473,396 Members | 2,029 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,396 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 5585
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: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

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.