Contenu | Rechercher | Menus

SWIG

SWIG est un outil logiciel d'interfaçage pour lier des programmes en C/C++ avec des programmes de plus haut-niveau comme Python, PHP, JavaScript…"

Pré-requis

pcre-config qui vient avec le paquet libpcre3-dev:

apt install libpcre3-dev

g++ qui vient avec build-essential

apt install build-essential

Installation

Télécharger le paquet swig sur http://www.swig.org/download.html 1)

Décompresser le fichier téléchargé:

tar xvfz swig-3.0.12

Lancer l'installation comme préciser sur le site de Swig:

./configure
make

et enfin l'installation finale avec les droits d'administration

make install

Utilisation

Le fichier interface (.i)

Il contient les variables et fonctions qui vont être dans l'interface et donc appelées par le(s) programme(s) de haut-niveau

exemple.i
/* exemple.i */
 %module exemple
 %{
 /* Put header files here or function declarations like below */
 extern double My_variable;
 extern void set_My_variables(double x, int i);
 extern double get_result(void);
 extern int get_result_entier(void);
 extern void place_mode(int i);
 extern char *get_time();
 %}
 
 extern double My_variable;
 extern void set_My_variables(double x, int i);
 extern double get_result(void);
 extern int get_result_entier(void);
 extern void place_mode(int i);
 extern char *get_time();

Créer les fichiers d'interfaçage

Exemple entre c++ et python:

swig -python -c++ mon_interface.i

Créer l'interface (lib)

Compilation avec les fichiers d'interfaçage, ici example.cxx :

 g++ -c -std=c++14 src/*.cpp src/exemple.cxx -I./lib

Éditions de liens:

g++ -shared *.o -o _exemple.pyd 

Utilisation de la librairie ainsi créé

Dans notre exemple en python, il suffit de réaliser un import:

 >>> import exemple 

Retour d'expériences

Avantages

  • Séparer les parties modèle/contrôleur et les vues (modèle de programmation MVC)
  • Résoudre les problèmes de gestion d'Utf-8 en C/C++
  • Profiter des atouts du (des) langage(s) haut-niveaux, voire de leur écosystème (notamment pour python)… PyQtGraph par exemple.
  • Permet des modifications rapide dans les vues sans recompilation

Inconvénients

  • Debuggage plus difficile de l'ensemble: pdb et gdb en ligne de commande :-/
  • Limitation dans l'usage des fonctionnalités du C++ modern (C++11/14/17) comme auto, enum class… au moins dans la partie interface

Voir aussi

Liens

1)
Vous pouvez passer via http://www.swig.org/survey.html afin de préciser aux développeurs quel binding (vers Python, PHP…) vous allez utiliser


Le contenu de ce wiki est sous licence : CC BY-SA v3.0