[Précédent (date)] [Suivant (date)] [Précédent (sujet)] [Suivant (sujet)] [Index par date] [Index par sujet]

Re: Ecrire des modules en C++ sous Linux



[email protected] (Pascal Forget) écrit :

> Mon probleme est que j'ai un programme en C++; je veux 
> pouvoir charger un "plug-in" et instancier un objet 
> en ne connaissant que le nom de la classe dans un char *.

Je n'y connaît pas grand chose, alors il existe peut-être une solution
toute faite sans que je le sache.  Voici ce que je sais.

Qui dit plug-in dit dlopen(), dlsym() et cie, d'une part.

D'autre part, le C++ utilise une technique appelée mangling pour
encoder la signature exacte (type des paramètres...) dans le nom des
symboles exportés par un fichier objet.  En plus, il y a possiblement
plusieurs constructeurs pour une classe.

Le mangling utilisé par un compilateur lui est propre.  Pour gcc/g++,
il y a un programme qui se nomme c++filt qui fait du demangling et une
version librairie de ce code se retrouve dans libiberty.a.  (Le source
se promène entre binutils, gcc, libg++, egcs, ...)  Cependant, si tu
pars d'un nom de classe, c'est un mangler et non un demangler dont tu
auras besoin pour en déduire le symbole à passer à dlsym().

Maintenant, supposons que tu en sois rendu juste après avoir obtenu le
pointeur à une fonction (méthode) retourné par dlsym().  Comment s'en
servir en C++ ?  Puisque c'est un langage assez statique, c'est-à-dire
qui en fait beaucoup à la compilation, il faudra sûrement que le
compilateur en aie une idée.  J'imagine que toutes ces classes
dynamiques pourraient être considérées comme dérivée d'une classe de
base connue à la compilation.

Voilà, c'est que qui m'est venu en tête.


Comme alternative, tu peux regarder du côté de CORBA et de son DII
(dynamic invocation interface).  Ça pourrait faire ton affaire.  Même
si ce n'est pas le cas, le design du binding C++ révèle peut-être des
choses intéressantes sur ce genre de techniques.


Charles