Problème de librairies dynamiques

Problème de librairies dynamiques - C++ - Programmation

Marsh Posté le 06-11-2009 à 16:59:10    

Bonjour tout le monde,
 
Alors je vous explique mon problème avant de perdre definitivement la boule...
Je suis en train de dévelloper une application a base de modules et de plugins avec la librairie wxWidgets.
J'aurait quelques questions sur les libraires dynamiques (.dll sous win et .so sous linux).
 
Quand sous linux on cree une librairie dynamique on se retrouve avec un fichier malib.so et c'est tout.
Pour charger les fonctions de la librairie de maniere portable il suffit de charger la lib puis de recuperer les symboles dans le programme les utilisant (wxDynamicLibrary::GetSymbol).
Mais est on obligé de recuperer manuellement les symboles a chaque fois ??
Il est pas possible dautomatiser tout ca?? Par exemple en ayant juste un .h a inclure qui contient les definitions des fonctions ??
 
Merci de votre aide. :)
 
PS: jutilise code::blocks sous linux

Reply

Marsh Posté le 06-11-2009 à 16:59:10   

Reply

Marsh Posté le 06-11-2009 à 19:57:51    

La liaison entre le .dll et ton application passe par un .a (ou un .o si ta dll ne fait qu'un seul fichier (peu probable)).
 
Dans le cas d'une lib statique, le .a contient le code intégral de toutes les fonctions. Dans le cas d'une dll, le .a contient le morceau de code qui ira chercher la référence dans le fichier .dll: ça revient à charger la dll s'il elle n'est pas déjà et récupérer l'adresse de la fonction.
 
Le truc c'est que le .a contient le nom de la dll à charger. Donc tu ne peux pas utiliser un même .a pour des dll avec des noms différents, ce qui est certainement le cas avec un système de plugin. Là tu es obligé de chargé ça à la main.
 
Avec  C::B, il te génère tout ça comme un grand, pour peu que tu lui indiques ça dans Project => Properties => Build targets

Reply

Marsh Posté le 08-11-2009 à 00:37:03    

Tout d'abord merci pour ta réponse.
Vu ce que j'ai l'intention de faire il vaut mieux comme tu l'as dit de charger tout à la main.
J'avais aussi pensé créer une librairie d'import au début mais ca ne fonctione que sous Windowx d'après le wiki de C::B (http://wiki.codeblocks.org/index.php?title=Project_file#Create_import_library) et de plus ca ne correspond pas trop pour un système de plugin.
 
Juste encore une question:
Quand on crée une DLL avec une classe qui contient des fonctions membres statiques, comment fait on pour les importer dans le programme qui l'utilise?? Je sais que pour les fonctions normales il suffit de faire un GetSymbol("mafonction" ) mais pour les fonctions statiques on fait comment?? Faut il créer une instance de la classe ou bien peut on y acceder directement avec un GetSymbol("maclasse::mafonction" ) ??
 
Merciiiiiiiiiiii :p

Reply

Marsh Posté le 08-11-2009 à 10:22:21    

En géénral, c'ets mieux d'éviter l'export de ce genre de fonction et voir éviter d'exporter des classes tout court. Mieux vaut passer par une famille de fonction-usine qui te renvoit une instance ou bien qui forward l'appel à la statique correspondante

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed