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
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
Installation
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
Utilisation
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
à 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
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 rapides dans les vues sans recompilation
Inconvénients
- Limitation dans l'usage des fonctionnalités du C++ modern (C++11/14/17) comme auto, enum class… au moins dans la partie interface