Ceci est une ancienne révision du document !
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:
apt install python3-dev
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 -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 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