2017-08-12 3 views
1

Voir l'image ci-dessous. Les plugins implémentent un interace de la bibliothèque principale. (QtPlugin) La classe plugin concrète est exportée. Les plugins devraient être capables de récupérer l'instance de classe plugin concrète du noyau et d'appeler ses méthodes. Si je veux implémenter ce type de plugins interactifs, dois-je lier les plugins entre eux?Ai-je besoin d'un lien implicite entre les bibliothèques partagées explicitement chargées pour l'interaction?

Je ne sais pas ce qui se passe exactement quand les symboles sont résolus. Autant que je puisse imaginer le processus stocke les symboles résolus. Ainsi, dès que la bibliothèque centrale a résolu les symboles, les plugins peuvent recevoir des objets d'autres classes de plugins et appeler des méthodes, s'ils ont les en-têtes. Est-ce vrai (pour toutes les plateformes)?

Des informations génériques sur l'emplacement des symboles stockés et sur les personnes pouvant y accéder seraient également utiles.

enter image description here

+0

"Je ne sais pas ce qui se passe exactement quand les symboles sont résolus" - quelque chose pour vous de lire là-bas .. –

+0

ces implicite les liens n'ont aucun sens – VTT

+0

Les plugins sont-ils chargés dynamiquement à l'exécution, ou statiquement au moment de la compilation par l'éditeur de liens? Ce n'est pas clair à cause de votre question. – 1201ProgramAlarm

Répondre

1

généralement vous liez contre quelque chose, ce greffon de liens avec les bibliothèques de base, car il a besoin de savoir sur la mise en œuvre de base pour fonctionner, le lien implicite n'existe pas, il n'y a pas connaissance du plug-in A l'intérieur de base (et il ne devrait pas y avoir) donc le noyau ne connaît pas le plugin A ou B, et cela signifie que les plugins B et A ne se connaîtront pas les uns les autres sans se lier les uns aux autres. Dans ce type de modèle, vous voulez le garder indifférent entre les plugins et utiliser des interfaces ou des classes abstraites pour communiquer. (par exemple si un plugin hérite de Core avec des fonctions virtuelles pures, un autre plugin peut contenir un pointeur dessus, et appeler des fonctions sans connaître l'implémentation complète)

généralement vous liez quelque chose, alors plugin A liens contre Bibliothèque de base car elle doit connaître l'implémentation de base pour fonctionner, le lien implicite n'existe pas, il n'y a pas de connaissance du plugin A à l'intérieur de Core (et il ne devrait pas y avoir) donc le noyau ne connait pas le plugin A ou B signifie que les plugins B et A ne se connaîtront pas les uns les autres sans se lier les uns aux autres.

Modifier pour commenter:

Dans ce cas, vous pouvez utiliser les interfaces, les plug-ins qui héritent. donc dans la bibliothèque de base, vous créez une classe appelée ITerminal, qui possède un ensemble de fonctions virtuelles (Update, Init, Connect, Open, tout ce dont vous avez besoin) sans implémentation, puis pluginA peut en hériter et donner les fonctions implémentations . De cette façon, d'autres plugins peuvent contenir un handle pour ITerminal et appeler des fonctions sans connaître les détails de pluginA. pour le créer vous avez besoin d'une usine par exemple Core :: CreateTerminal, qui retournera un ITerminal (ITerminal * object = new PluginA();) maintenant pluginB peut appeler Core :: CreateTerminal, ce qui leur donne un handle pour ITerminal qui a une implémentation que Core a choisi dans ce cas. Pour développer cela, vous pouvez faire en sorte que les plugins s'inscrivent au noyau, donc le noyau appelle simplement une fonction create dans le plugin, par exemple pluginA peut s'inscrire en tant que classe ITerminal, alors quand CreateTerminal est appelé, il appelle le plugin objet. De cette façon, vous pouvez échanger des plugins dedans et dehors (avoir des terminaux différents sans changer de Core ou d'autres plugins)

+0

Je souhaite autoriser les interdépendances de plug-in. Les dépendances seront connues lors de l'exécution. libcore s'assure que les dépendances sont chargées avant les dépendants et injecte les dépendances. Dépendances dures de cas d'utilisation: A est responsable de tous les éléments du terminal. B doit ouvrir un terminal. Dépendances facultatives de cas d'utilisation: A fournit une interface pour enregistrer les gestionnaires, B veut en enregistrer une. La question est de savoir comment l'implémenter avec cpp. – ManuelSchneid3r

+0

depuis qu'il était un peu long j'ai mis à jour la réponse pour inclure des commentaires sur votre commentaire – Giel

+0

J'apprécie votre aide mais le noyau doit être indépendant des interfaces. Je viens de le tester. Les décences dures sont "faciles" en liant les autres plugins. Cependant, les dépendances optionnelles sont difficiles car je ne peux pas les lier car l'éditeur de liens les rend très dépendantes. – ManuelSchneid3r