Wrapping C++ class with SWIG, Mac OS X

Diez B. Roggisch deets at nospam.web.de
Sat Apr 12 03:13:19 CEST 2008


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<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.
>  >>> 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



More information about the Python-list mailing list