Contenu | Rechercher | Menus

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

utilisateurs:bcag2:swig [Le 29/11/2017, 15:50] (Version actuelle)
bcag2 créée
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]]//​


Le contenu de ce wiki est sous licence : CC BY-SA v3.0