Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
|
utilisateurs:bcag2:swig [Le 29/11/2017, 15:50] bcag2 créée |
— (Version actuelle) | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | {{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 ===== | ||
| - | pcre-config qui vient avec le paquet libpcre3-dev: | ||
| - | <code>apt install libpcre3-dev</code> | ||
| - | g++ qui vient avec **[[apt://build-essential|build-essential]]** | ||
| - | <code>apt install build-essential</code> | ||
| - | |||
| - | ===== Installation ===== | ||
| - | Télécharger le paquet swig sur [[http://www.swig.org/download.html]] ((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)) | ||
| - | |||
| - | [[: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 ===== | ||
| - | ==== 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</code> | ||
| - | |||
| - | Éditions de liens: | ||
| - | <code>g++ -shared *.o -o _exemple.pyd </code> | ||
| - | |||
| - | ==== Utilisation de la librairie ainsi créé ==== | ||
| - | Dans notre exemple en python, il suffit de réaliser un //import//: | ||
| - | <code> >>> import exemple </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 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 | ||
| - | |||
| - | ===== 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)]] | ||
| - | |||
| - | ---- | ||
| - | //Contributeurs principaux: [[:utilisateurs/bcag2]]// | ||