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