{{tag> programmation}}
----
====== SWIG ======
[[wpfr>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 **[[apt>libpcre3-dev|libpcre3-dev]]**:
apt install libpcre3-dev
* //g++// qui vient avec **[[apt>build-essential|build-essential]]**
apt install build-essential
Pour réaliser des interfaces vers python, il est souvent nécessaire d'ajouter **[[apt>python3-dev]]**\\
apt install python3-dev
===== Installation =====
==== A partir d'un paquet existant ====
Les paquets deb existent à l'adresse suivante: [[https://packages.debian.org/sid/swig|paquet swig pour debian sid]]
==== À partir des sources ====
Télécharger le paquet swig sur [[https://www.swig.org/download.html|la page du projet]] ((Vous pouvez passer via [[http://www.swig.org/survey.html|cette autre lien]] afin de préciser aux développeurs quel binding (vers Python, PHP…) vous allez utiliser))
[[:tar#compression_avec_gzip_targz|Décompresser]] le fichier téléchargé:
tar xvfz swig-3.0.12
Lancer l'installation comme préciser sur le [[http://www.swig.org/Doc2.0/SWIGDocumentation.html#Preface_unix_installation|site de Swig]]:
./configure
make
et enfin l'installation finale avec les [[:sudo|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 */
%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
===== 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 ====
* Debuggage plus difficile de l'ensemble: [[python#debugger_avec_pdb|pdb]] et [[:gdb]] en ligne de commande((https://stackoverflow.com/questions/29749799/how-to-debug-a-python-c-program)) :-/
* 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 =====
[[:zeromq]]
===== Liens =====
* [[http://www.swig.org|le site officiel de swig (en)]]
* [[https://matthieu-brucher.developpez.com/tutoriels/python/swig-numpy/|tutoriel sur developpez.com (un peu ancien)]]
* [[https://github.com/swig/swig|Swig sur github]]
----
//Contributeurs principaux: [[:utilisateurs/bcag2]]//