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…"

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

A partir d'un paquet existant

Les paquets deb existe à l'adresse suivant: https://packages.debian.org/sid/swig

À partir des sources

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

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 notre exemple en python, il suffit de réaliser un import:

 >>> import exemple 

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

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
  • swig.1512137127.txt.gz
  • Dernière modification: Le 01/12/2017, 15:05
  • par bcag2