Outils pour utilisateurs

Outils du site


lib:swig

Ceci est une ancienne révision du document !


Utilisation de base

libmod.i
// Nom de la librairie de sortie
%module mod
 
%{
// Inclure tous les entêtes à convertir
#include "file1.h"
#include "file2.h"
#include "file3.h"
}
 
// Inclure tous les entêtes à convertir en commençant par un %
%include "file1.h"
%include "file2.h"
%include "file3.h"

template

Pour les template, il faut les définir manuellement entre le %include qui le défini et le %include qui l'utilise. Il y a donc un problème si le template est défini et utilisé dans le même entête.

libmod.i
%module mod
 
%{
#include "file1.h"
#include "file2.h"
}
 
// file1.h contient une classe file1_classe<T>
%include "file1.h"
 
%template(file1_classe_int) file1_classe<int>;
 
// file2.h utilise une implémentation de file1_classe<int>.
%include "file2.h"

Can't wrap 'xxx' unless renamed to a valid identifier.

C'est le cas des opérateurs operator !=. Ajouter en début de fichier après le %module …

%rename(operator_not_equal) operator!=;

Multiple inheritance is not supported in

Ajouter après %module :

%include <swiginterface.i>

Soit la ClasseA

class ClassA : public Number, public Base<int> {}

Ajouter:

%interface_impl(Number);
%include "number.h"
%interface_impl(Base);
%include "base.h"
%rename(base_int_ren) Base<int>;
%template(base_int) Base<int>;

<note>Je n'ai pas testé mais je conseille de mettre un nom différent lors du rename et du template.</note>

Si Number possède un parent, ce parent doit aussi être déclaré en interface.

<note warning> Par contre, il y a un soucis si une classe avec template doit être déclarée en interface :

%interface_impl(InterfaceVisitable);
// Nécessaire car swiginterface.i fait NomDeLaClasseAvecTemplateImplSwigImpl.
// InterfaceVisitable<Number>SwigImpl est logiquement invalide sans rename
%rename(interface_visitable_number_ren) InterfaceVisitable<Number>;
// Mais lors de la déclaration du %template, c'est l'échec.
%template(interface_visitable_number) InterfaceVisitable<Number>

J'ai le résultat :

Error: The interface feature name 'interface_visitable_number_ren' for proxy class 'interface_visitable_number_ren' is already defined in the generated target language module in scope ''.

J'ai contourné le problème en appliquant le patch :

swig-3.0.12_already_defire.patch
--- swig-3.0.12/Source/Modules/lang.cxx.old 2018-05-13 21:12:40.053036596 +0200
+++ swig-3.0.12/Source/Modules/lang.cxx 2018-05-13 21:12:58.471397758 +0200
@@ -3146,7 +3146,6 @@ int Language::addInterfaceSymbol(const S
       Swig_error(input_file, line_number, "The interface feature name '%s' for proxy class '%s' is already defined in the generated target language module in scope '%s'.\n",
    interface_name, proxy_class_name, scope);
       Swig_error(Getfile(existing_symbol), Getline(existing_symbol), "Previous declaration of '%s'\n", interface_name);
-      return 0;
     }
     if (!addSymbol(interface_name, n, scope))
       return 0;

</note>

lib/swig.1526244863.txt.gz · Dernière modification : 2018/05/13 22:54 de root