[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