2010-10-02 21 views
4

J'ai un problème étrange qu'aucune fonction virtuelle pure n'exporte d'une DLL. DLL compile et renvoie le fichier .dll dans le répertoire. Mais il ne produit pas de fichier .lib.Comment exporter des fonctions virtuelles pures à partir d'une DLL en C++?

Si je donne une définition et qu'il ne s'agit plus d'un simple virtuel, après cela, il crée heureusement un fichier .lib.

Je dois mettre en œuvre un modèle d'usine pour lequel j'ai besoin de séparer les interfaces et les implémentations. Mon implémentation d'usine et d'autres interfaces qui utilisent .dll voulu (dont le fichier .lib ne produit pas) doivent utiliser cette fonction exportée et lorsque j'utilise ces fonctions, elles produisent des erreurs de liaison ...

comme "erreur LNK2011: symbole externe non résolu « public: ....... »

Avoir une idée comment exporter des fonctions virtuelles pures afin qu'ils puissent être mis en œuvre pour d'autres années exe et

de dll

Cordialement Usman

+0

duplication possible de [N'est-il pas nécessaire d'exporter une classe avec uniquement des fonctions virtuelles/intégrées?] (Http: // stackoverflow.com/questions/549983/non-nécessaire-pour-exporter-class-with-only-virtual-inline-fonctions) –

Répondre

6

Lorsque vous exportez quelque chose à partir d'une DLL que vous créez un nom externe visible pour quelque chose de concret dans cette DLL - une fonction définie ou une classe. Sans cela, l'étape de liaison pour l'importation de projets (ceux qui référencent cette DLL) ne peut pas résoudre toutes les références requises aux fonctions et aux classes de la DLL d'exportation. Pour les fonctions virtuelles pures, il n'y a pas de «chose» concrète dans la DLL d'exportation: aucun nom pouvant être lié ne peut exister pour résoudre un appel externe vers une fonction virtuelle pure - si tel était le cas, elle ne serait pas pure. Dans ce cas, tout ce qui est nécessaire est une déclaration dans un fichier d'en-tête accessible à la compilation de la fonction virtuelle pure, de sorte que l'importation d'EXE ou de DLL sache comment le remplacer par une fonction concrète.

1

En C++, vous pouvez définir une méthode virtuelle pure. Par exemple:

// T.hpp 
class T 
{ 
    public : 
     virtual void doSomething() = 0 ; 
     // etc. 
} ; 

.

// T.cpp 
void T::doSomething() 
{ 
} 

// etc. 

Maintenant, avec le spécificateur dllexport/dllimport ajouté à la classe T, vous méthode doSomething Exportée. Le point de définir le corps d'une méthode virtuelle pure était de s'assurer que l'utilisateur remplacerait la méthode, tout en offrant une implémentation par défaut. Ma propre utilisation de ce modèle est d'éviter un plantage lorsque, pour une raison ou une autre, la méthode virtuelle est appelée avant qu'elle n'existe ou qu'elle n'existe plus (par exemple, dans le constructeur ou le destructeur du résumé de base). classe). En mode debug, il lancera le débogueur (::DebugBreak() fonction API Win32) et en mode release, il ne fera rien en silence.

Mais ce modèle peut également être utilisé pour résoudre votre problème, si vous avez vraiment besoin d'exporter vos fonctions virtuelles pures.

+0

Personnellement, je pense qu'un crash est préférable à ne rien faire en silence lorsque le programmeur client visse. –

+0

@John Dibling: Je suis d'accord, mais au moins, la surcharge des méthodes virtuelles pures permet à l'utilisateur de choisir. En ce qui me concerne, je voudrais enregistrer le problème, puis lancer une exception d'exécution avec le message "Vous avez appelé cette méthode, ce qui est faux, bla bla bla". – paercebal