Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
swig [Le 31/01/2018, 15:09] – [Inconvénients] bcag2 | swig [Le 22/02/2018, 12:27] (Version actuelle) – [Inconvénients] ajout lien vers pdb bcag2 |
---|
| {{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]]**: <code> |
| apt install libpcre3-dev</code> |
| * //g++// qui vient avec **[[apt>build-essential|build-essential]]** <code> |
| apt install build-essential</code> |
| |
| Pour réaliser des interfaces vers python, il est souvent nécessaire d'ajouter **[[apt>python3-dev]]**\\ |
| <code>apt install python3-dev</code> |
| |
| ===== 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 [[http://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é: |
| <code>tar xvfz swig-3.0.12</code> |
| |
| Lancer l'installation comme préciser sur le [[http://www.swig.org/Doc2.0/SWIGDocumentation.html#Preface_unix_installation|site de Swig]]: |
| <code> |
| ./configure |
| make |
| </code> |
| et enfin l'installation finale avec les [[:sudo|droits d'administration]] |
| <code>make install</code> |
| |
| ===== 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 |
| <file - 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(); |
| </file> |
| |
| ==== Créer les fichiers d'interfaçage ==== |
| Exemple entre c++ et python: |
| <code>swig -python -c++ mon_interface.i</code> |
| |
| ==== Créer l'interface (lib) ==== |
| Compilation avec les fichiers d'interfaçage, ici //example.cxx// : |
| <code> g++ -c -std=c++14 src/*.cpp src/exemple.cxx -I./lib -I/usr/include/python3.4 </code> |
| <note important>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 </note> |
| Éditions de liens: |
| <code>g++ -shared *.o -o _exemple.so </code> |
| |
| ==== Utilisation de la librairie ainsi créé ==== |
| Dans l'exemple python/class fourni, en python donc, il suffit de réaliser un //import//: |
| <code> |
| >>> from example import * |
| >>> c = Circle(5.2) |
| >>> print (c.area()) |
| 84.94866535 |
| </code> |
| |
| ===== 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)]] |
| * [[http://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]]// |