From: Marcelo M. <mm...@ac...> - 2006-04-18 18:37:14
|
Jerome Glisse wrote: >Hi, > >I am trying to use template with swig but i face a strange bug >anytime i am trying to link with a template class with function >compiled in a file python complain for undefined symbol at >runtime even though that this symbol appear >(strings test.so | grep guiltysymbol) > > You need to use nm test.so | grep guiltysymbol if you see U guiltysymbol the symbol is undefined. If you have a .cxx file with the template definitions, you need to compile it with the rest of the swig interface, ie, something like: g++ -shared -o _module.so -c module_wrap.cxx mytemplate.cxx or just put everything in the interface file. There are other ways too, and you will need to find a way to do the compiling/linking that satisfy your own develepment requirements.... so, in short, this is not a swig issue, but a linking/compiling issue, that have different possible solutions, and you need to think a little about which one you want to pick. Marcelo >If i do all template class function in h everythings work. >I attach a simple test case. Right now i am using 1.3.27 >maybe it have been fixed since but after googling few >hours i didn't find anythings. > >I attach a simple test case build using build.sh > >thx for your help, >Jerome Glisse > > >------------------------------------------------------------------------ > >#include "TVector2D.hxx" > >#if ALLINH >#else >// ============================================================================ >template<class T> TVector2D<T>::TVector2D(const T& x, const T& y) >{ > fX = x; > fY = y; >} > >// ============================================================================ >template<class T> TVector2D<T>::~TVector2D() >{ >} > >// ============================================================================ >template<class T> TVector2D<T>::TVector2D() >{ >} > >// ============================================================================ >template<class T> TVector2D<T>::TVector2D(const TVector2D<T>& v) >{ > fX = v.fX; > fY = v.fY; >} > >// ============================================================================ >template<class T> TVector2D<T>& >TVector2D<T>::operator = (const TVector2D<T>& v) >{ > fX = v.fX; > fY = v.fY; > return *this; >} > >// ============================================================================ >template<class T> TVector2D<T> TVector2D<T>::operator + (const TVector2D& v) >{ > return TVector2D<T>(fX + v.fX, fY + v.fY); >} > >// ============================================================================ >template<class T> bool TVector2D<T>::operator == (const TVector2D& v) const >{ > if (fX == v.fX && fY == v.fY) > return true; > return false; >} > >// ============================================================================ >template<class T> const T& TVector2D<T>::GetX() const >{ > return fX; >} > >// ============================================================================ >template<class T> const T& TVector2D<T>::GetY() const >{ > return fY; >} >#endif > > > >------------------------------------------------------------------------ > >/* > * TVectorUnique vector of unique member class > * > * Copyright (C) 2005 Jerome Glisse <j.g...@gm...> > * > * This program is free software; you can redistribute it and/or modify > * it under the terms of the GNU General Public License as published by > * the Free Software Foundation; either version 2 of the License, or > * (at your option) any later version. > * > * This program is distributed in the hope that it will be useful, > * but WITHOUT ANY WARRANTY; without even the implied warranty of > * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > * GNU General Public License for more details. > * > * You should have received a copy of the GNU General Public License > * along with this program; if not, write to the Free Software > * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > */ >#ifndef _VECTORUNIQUE_H >#define _VECTORUNIQUE_H > >#include <vector> >#include <string> > >template<class T> class TVectorUnique { >private: > std::vector<T> fVector; > >public: > TVectorUnique(); > TVectorUnique(const TVectorUnique<T>& v); > ~TVectorUnique(); > > const T& operator [] (int i) const; > > void clear(); > bool push_back(const T& e); > int size() const; >}; > >#endif > > > >------------------------------------------------------------------------ > >#!/usr/bin/python > ># MODULES --------------------------------------------------------------------- >import test > ># MAIN ------------------------------------------------------------------------ >t = test.Vector2D(2, 5) >print t.GetX(),t.GetY() > > |