| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
| swig [Le 01/12/2017, 10:24] – [Utilisation] 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]]// |