Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
swig [Le 29/11/2017, 16:05] bcag2 créée |
swig [Le 31/08/2022, 23:33] (Version actuelle) moths-art Passage de http à https sur les liens externes (détecté et corrigé via le bot wiki-corrector (https://forum.ubuntu-fr.org/viewtopic.php?id=2067892) |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
{{tag> programmation}} | {{tag> programmation}} | ||
+ | ---- | ||
====== SWIG ====== | ====== 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…" | + | [[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 ===== | ===== Pré-requis ===== | ||
- | pcre-config qui vient avec le paquet libpcre3-dev: | + | Les paquets suivants doivent être présents pour pouvoir installer swig: |
- | <code>apt install libpcre3-dev</code> | + | * //pcre-config// qui vient avec le paquet **[[apt>libpcre3-dev|libpcre3-dev]]**: <code> |
- | g++ qui vient avec **[[apt://build-essential|build-essential]]** | + | apt install libpcre3-dev</code> |
- | <code>apt install build-essential</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 ===== | ===== 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)) | + | ==== 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#compression_avec_gzip_targz|Décompresser]] le fichier téléchargé: | ||
Ligne 25: | Ligne 34: | ||
===== Utilisation ===== | ===== Utilisation ===== | ||
+ | De nombreux exemples existent dans le répertoire //Examples//, un fichier //index.html// y donne des indications utiles. | ||
==== Le fichier interface (.i) ==== | ==== 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 | Il contient les variables et fonctions qui vont être dans l'interface et donc appelées par le(s) programme(s) de haut-niveau | ||
Ligne 54: | Ligne 64: | ||
==== Créer l'interface (lib) ==== | ==== Créer l'interface (lib) ==== | ||
Compilation avec les fichiers d'interfaçage, ici //example.cxx// : | Compilation avec les fichiers d'interfaçage, ici //example.cxx// : | ||
- | <code> g++ -c -std=c++14 src/*.cpp src/exemple.cxx -I./lib</code> | + | <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: | Éditions de liens: | ||
- | <code>g++ -shared *.o -o _exemple.pyd </code> | + | <code>g++ -shared *.o -o _exemple.so </code> |
==== Utilisation de la librairie ainsi créé ==== | ==== Utilisation de la librairie ainsi créé ==== | ||
- | Dans notre exemple en python, il suffit de réaliser un //import//: | + | Dans l'exemple python/class fourni, en python donc, il suffit de réaliser un //import//: |
- | <code> >>> import exemple </code> | + | <code> |
+ | >>> from example import * | ||
+ | >>> c = Circle(5.2) | ||
+ | >>> print (c.area()) | ||
+ | 84.94866535 | ||
+ | </code> | ||
===== Retour d'expériences ===== | ===== Retour d'expériences ===== | ||
Ligne 68: | Ligne 83: | ||
* Résoudre les problèmes de gestion d'Utf-8 en C/C++ | * 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. | * 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 | + | * Permet des modifications rapides dans les vues sans recompilation |
==== Inconvénients ==== | ==== Inconvénients ==== | ||
- | * Debuggage plus difficile de l'ensemble: pdb et [[:gdb]] en ligne de commande :-/ | + | * 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 | * Limitation dans l'usage des fonctionnalités du C++ modern (C++11/14/17) comme //auto//, //enum class//… au moins dans la partie interface | ||
Ligne 79: | Ligne 94: | ||
===== Liens ===== | ===== Liens ===== | ||
* [[http://www.swig.org|le site officiel de swig (en)]] | * [[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://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]]// | //Contributeurs principaux: [[:utilisateurs/bcag2]]// |