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…

Les paquets suivants doivent être présents pour pouvoir installer swig:

  • pcre-config qui vient avec le paquet libpcre3-dev:
    apt install libpcre3-dev
  • g++ qui vient avec build-essential
    apt install build-essential

Pour réaliser des interfaces vers python, il est souvent nécessaire d'ajouter python3-dev

apt install python3-dev

A partir d'un paquet existant

Les paquets deb existent à l'adresse suivante: paquet swig pour debian sid

À partir des sources

Télécharger le paquet swig sur la page du projet 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

De nombreux exemples existent dans le répertoire Examples, un fichier index.html y donne des indications utiles.

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 -I/usr/include/python3.4 
Il faut généralement ajouter le lien vers des librairies, pour python, ci-dessus -I/usr/include/python3.4 par exemple…
à adapter selon le langage haut-niveau cible et/ou la version désirée

Éditions de liens:

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

Utilisation de la librairie ainsi créé

Dans l'exemple python/class fourni, en python donc, il suffit de réaliser un import:

>>> from example import *
>>> c = Circle(5.2)
>>> print (c.area())
84.94866535

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 rapides dans les vues sans recompilation

Inconvénients

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

1)
Vous pouvez passer via cette autre lien afin de préciser aux développeurs quel binding (vers Python, PHP…) vous allez utiliser
  • swig.txt
  • Dernière modification: Le 22/02/2018, 11:27
  • (modification externe)