Bonjour
Je souhaitrai savoir comment je peux utiliser des plugin '.so' contenant des classes C++, j 'ai réussi a créer des plugin avec des fonction dedans mais pas des classes.
Merci
Bonjour
Je souhaitrai savoir comment je peux utiliser des plugin '.so' contenant des classes C++, j 'ai réussi a créer des plugin avec des fonction dedans mais pas des classes.
Merci
Gros sujet! Si ton ".so" est compilé avec le même compilateur (même version) et les mêmes options de compilation que ton application hôte, il n'y a presque aucune différence avec une bibliothèque statique. Par contre, si il y a le moindre changement, les choses se gâtent: c'est l'un des points faibles du C++ que de ne pas avoir une ABI (spécification binaire) bien définie et suivie par tous les compilateurs et toutes leurs versions, et les plugins en C++ sont une gageure.
Qu'est-ce que tu cherches à faire exactement?
Carl
Merci pour ta réponse,
en faite, j'ai trois classes qui servent a prendre n'importe quel tableau ou vector de n'importe quel type et le trie.
c'est une application graphique, ce que je souhaite c'est que l'application soit séparé des classes de tri et je veux aussi pouvoir par la suite rajouter de nouvelles classes et tous ca sous forme de plugin que je charge par un bouton charger.
Je crois que je ne vois pas l'intérêt d'avoir ces algorithmes de tri dans des plugins, s'ils ne diffèrent que par les types de données qu'ils peuvent trier. En effet, chaque bout de code qui devra utiliser un "nouveau" tri parce qu'il a un type pour lequel l'un des tris existants ne fait pas l'affaire devra de toute façon fournir cette implémentation de tri, sous peine de ne pas compiler.
Dans ton cas de figure, tu devrais plutôt fournir un ou deux templates d'algorithmes de tri dans un header de ton système de base et donner accès à ces headers à ceux qui fourniront des plugins. Ou alors ils utilisent tout simplement std::sort()...
J'ai peut-être mal compris ton idée. Tu peux m'en dire plus sur tes algos de tri et sur tes classes?
Carl
Bain l'interet des plugin n'est pas immediat, plutard si une personne veux utiliser son propre algorithme, elle le cree et le compile en tant que .so et le charge via l'appliction et ainsi il pourra utiliser son algorithme dans l'application.
Le principe n'est pas compliqué, c'est le mettre en application qui l'est:
Tu dois créer une bibliothèque commune entre ton application et ton plugin. Cette biblio ne contiendra que des interfaces (si tu ne sais pas ce qu'est une interface ou si tu te dis "oh les interfaces ça existe pas en C++" il est temps d'aller potasser). A noter au passage qu'à priori cette biblio sera toujours header only. Tout dialogue entre ton applic et un plugin ou inversément se fait obligatoirement via des interfaces et rien d'autre point barre.
Après, à partir du moment où tu sais appeler une fonction dans une librairie dynamique, il suffit de définir une fonction du style:
Et la tu sais tout faire, oui tout, on est dans du pur orienté objet alors quel que soit le ou les problèmes auquel tu pourrais être confronté il y a forcément une solution, mais ça relève de la conception OO.
Code : Sélectionner tout - Visualiser dans une fenêtre à part TonInterface* givemeyourinterface();
Pour les interfaces je vais m'informer sur ca.
Par contre, j'ai réalisé un exmple très simple qui illustre mon problème, et j'ai la même erreur.
mon plugin: test.so
mon programme principale
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 extern "C++" { #include <stdio.h> template< class classTest > void chien( void ) { printf( "\\wof wof/\n" ); printf( " \\...../\n" ); printf( " ...\n" ); printf( " .\n" ); printf( " <I________/\n" ); printf( " || ||\n" ); } // chien() }
erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <iostream> #include <dlfcn.h> using namespace std; typedef void ( * FCT ) ( void ); int main( void ) { void* dlobj; if( dlobj = dlopen( "test.so", RTLD_LAZY ) ) { FCT fct_appel = ( FCT ) dlsym( dlobj, "chien" ); ( * fct_appel )< int >(); } return 0; } // main()
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 main.cxx: In function «int main()": main.cxx:15: erreur: expected primary-expression before «int" main.cxx:15: erreur: expected `;' before «int" make: *** [main.o] Erreur 1
Partager