10
votes

Une bibliothèque chaude puffable C ++ possible?

Je cherche à "Hot Plug" une bibliothèque de code C ++. Je suis intéressé à avoir cette technique de travail de travail entre Linux / Mac / Windows. Fondamentalement, je veux avoir le programme principal #include "statemachine.h" qui définit toutes les interfaces appelables. Ensuite, au moment de l'exécution et lors de la charge d'exécution et de déchargement de la statemachinelibrary.a pour que mon application utilise différentes machines d'état.

Une pensée que j'ai, c'est peut-être quelque chose comme écrire une enveloppe qui charge ce code compilé à ma propre mémoire Malloc'd et crée des pointeurs de fonction dans cette mémoire?

La motivation est que les parties de Machine d'état de mon projet changeront fréquemment et nécessiteront une recompilation, permettraient également à l'application principale de continuer à fonctionner avec différentes machines d'état en cours de chargement. J'espère utiliser une bibliothèque «chaude pluggable» au lieu de quelque chose comme des scripts Lua en raison de vos préoccupations, ce qui considère que comme une alternative a déjà été explorée.


3 commentaires

Le mot-clé que vous recherchez est le plugin, pas chaud-pincesf. Googling C ++ et le plugin devraient vous obtenir de très bons hits.


Related: Stackoverflow. com / questions / 384121 / ... et si vous avez besoin de plug-ins inter-plate-forme: Stackoverflow.com/questions/1854323/...


Demandez à la recherche de C ++ OSGI - il existe plusieurs bibliothèques qui mettent en œuvre ce cadre.


7 Réponses :


17
votes

Définissez une interface de base et dérivez vos implémentations. Mettez-les dans des bibliothèques dynamiques (DLL / SO) et chargez-les au moment de l'exécution. La bibliothèque aura juste besoin d'une fonction d'usine statique pour vous donner une instance de sa mise en œuvre.

// shared
class Base {
 public:
   virtual void DoTheWork() = 0;
};

// within the DLL/SO
class Hotplugged : public Base {
  public:
   virtual void DoTheWork() {
      std::cout<<"I got hotplugged!"<<std::endl;
   }
};

extern "C" Base* CreateIt() {
  return new Hotplugged();
} 

// within the app (sample for Windows/MSVC)
... ::LoadLibrary("mydll");
Base* (*fpCreateIt)() = (Base*(*)())::GetProcAddress(... "CreateIt");
// call the function pointer to obtain a Base instance
Base* mybase = fpCreateIt();

// prints the above text
mybase->DoTheWork(); 
delete mybase;


0 commentaires

2
votes

Oui - c'est certainement possible. Dans un rôle précédent où nous avons développé une API graphique 3D et des applications, nous laissons l'utilisateur choisir le pilote d'affichage "à la volée". La vue devait être recréée, mais l'application elle-même n'avait pas besoin de s'éteindre.


0 commentaires

2
votes

Bien que de nombreuses parties de celle-ci soit assez datée, styles de programmation avancés C ++ et idiomes (James Coplien) a une section sur la manière de faire de telles choses qui pourraient être utiles à lire (bien que je sois Je ne sais pas que j'achèterais une copie juste pour cela).


0 commentaires

2
votes

Découvrez Boost.Reflection et Boost.extension - ils ont été conçus pour répondre aux diverses questions liées à la tentative de telles choses. Je suis sûr que cela ne vous permet toujours pas de travailler sur des compilateurs ou des versions, mais cela pourrait vous être de l'aide.


0 commentaires

6
votes

Ceci est possible. Pour les travaux multiples-plate-forme (au moins recompiler uniquement), vous voudrez peut-être examiner certains cadres existants qui font cela.

OpenSceneGraph comprend une implémentation complète de "Hot-Pluggable" pour le chargement et le déchargement des plugins .

Qt a un cadre de plugin , également.

Le "astuce" est d'une interface propre pour vos plugins et d'utiliser simplement des bibliothèques dynamiques pouvant être chargées et déchargées. Presque toutes les plateformes (toutes les principales) soutiennent le chargement et le déchargement dynamiques des bibliothèques, il n'ya donc rien qui empêche de travailler.


0 commentaires

0
votes

Et n'oubliez pas xpcom. Il est conçu pour être un com.


1 commentaires

Firefox est basé sur elle et beaucoup de gens l'utilisent tous les jours. Le bureau est basé sur COM et plus de personnes l'utilisent tous les jours.



1
votes

J'ai initialement écrit v3c-dcom juste pour voir si je pouvais le faire - vous pouvez le télécharger à partir de Sourceforge.
C'est essentiellement juste un système de plug-in pour le moment.
Cela dépend de trois autres projets Sourceforge, vous devrez donc les télécharger et les installer en premier.

aller à Sourceforge http://sourceforge.net/ et téléchargez les projets suivants:

* V3C
* Treedb
* Meta-Treedb
* v3c-dcom

v3c contient un système de construction et une bibliothèque d'utilités générale.
Treedb contient la fonctionnalité de la mémoire "persistante".
META-TREEDB ENDAPS TREESB OLLIDATIONS INLINEB INLINEB dans une couverture, raccourcir les temps de compilation et le code de code.
v3c-dcom contient quelques exemples, y compris la création d'un référentiel de plug-in dans le programme, ajoutant une bibliothèque au référentiel, appelant coCreateInstance () pour créer des objets et des méthodes d'appel sur ces objets.

J'ai conçu le système de construction pour être convivial, même s'il est basé sur la route;)

juste faire make && sudo fait installer dans les répertoires non enregistrés de chaque projet à son tour.

Si vous êtes paranoïaque ou que vous n'avez pas de privilèges "sudo", lisez le logiciel "Tryout" de la V3C sur la manière de décompresser / construire / installer les packages sous un répertoire que vous possédez.

faire vérifier exécutera chaque bibliothèque à travers ses pas et pour V3C-DCOM, il exécutera la démo que j'ai mentionnée ci-dessus.

J'espère que cela aide.


1 commentaires

Merci pour les informations et bienvenue sur le site! En tant que de côté et pour quiconque qui se soucie, j'ai fini par abandonner ce plan simplement en raison de limitations sur les bibliothèques dynamiques sur iOS, qui est une cible principale de la mienne. Et j'ai également pensé que pour tout ce que je fais, je peux obtenir des résultats similaires par une liaison statique et juste une instanciation (identique au code "intégré" à ce moment-là))