[Dcmlib] Swig + forbidden namespace gdcm
Eric Boix
Eric.Boix at creatis.insa-lyon.fr
Mon Oct 18 11:10:32 CEST 2004
Salut Mathieu,
Lorsque Swig wrappe le code (i.e. pour un %include) d'une classe A faisant
reference a une autre classe B (par exemple dans une methode) qui elle
EST wrappe'e, alors le code wrappe' de A utilise le namespace gdcm::.
Exemple: dans gdcm_wrap.cxx le wrapping de Document::SetShaDict( Dict* )
est le suivant
static PyObject *_wrap_Document_SetShaDict(PyObject *self, PyObject *args)
{
PyObject *resultobj;
gdcm::Document *arg1 = (gdcm::Document *) 0 ;
gdcm::Dict *arg2 = (gdcm::Dict *) 0 ; <---- y'a bien gdcm::
...
Par contre, lorsque la classe B N'est PAS wrappe' par Swig, le code
wrappe' de A ne fait pas reference au namespace gdcm. En admettant que
gdcm::Dict ne soit donc pas wrappe' (par de %include "gdcmDict.h"),
l'exemple ci-dessus deviendrait:
static PyObject *_wrap_Document_SetShaDict(PyObject *self, PyObject *args)
{
PyObject *resultobj;
gdcm::Document *arg1 = (gdcm::Document *) 0 ;
Dict *arg2 = (gdcm::Dict *) 0 ; <---- il N'y a PAS gdcm::
...
et donc la compilation de gdcm_wrap.cxx echouera car en l'absence d'un
"using namespace gdcm" le type Dict est inconnu.
Deux solutions:
1/ wrapper toutes les classes necessaires pour que Swig passe.
2/ utiliser un "using namespace gdcm" dans gdcmPython/gdcm.i
La solution 1/ comporte les inconvenients:
* de generer un gros code wrappe' et donc une grosse librairie dynamique
que Python devra loader,
* d'exporte inutilement des classes internes de gdcm (i.e. sans pouvoir
se limiter a l'API),
* de compliquer l'ecriture de gdcmPython/gdcm.i, ou comme tu le sais
l'ordre des %include importe. Ajouter un nouvelle classe prends parfois
du temps (j'ai perdu une bonne heure, avant de comprendre que le premier
%include doit etre celui de gdcmCommon.h).
La solution 2/ (qui etait possible avant le passage au namespace) casserait
la compilation sous Cygwin en contrevenat a l'interdiction de l'usage
du namespace gdcm.
Que faire ?
Eric.
More information about the Dcmlib
mailing list