Différences

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

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
swig [Le 31/01/2018, 15:10] – [Avantages] bcag2swig [Le 22/02/2018, 12:27] (Version actuelle) – [Inconvénients] ajout lien vers pdb bcag2
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 =====
 +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]]//