2010-04-17 4 views
3

J'ai un assez grand projet Core avec lequel je travaille, j'essaie de l'adapter pour utiliser un moteur DLL que j'ai construit, je reçois un tas d'erreurs comme:C++ DLL-Linking Externals non résolus

symbole externe non résolu « privé: classe statique

en incluant quelques-uns des en-têtes de la base dans la DLL, la classe est exportée via __declspec (dllexport), mais l'en-tête avec les membres statiques jette un crapload d'erreurs en ce qui concerne les membres statiques

Ceci est un assez gros projet, je ne peux pas exactement courir autour de supprimer tous les statiques membre de la classe que je vois, y at-il de toute façon autour de ce genre de chose?

Un exemple de base d'une classe qui est en cours d'importation:

class __declspec(dllexport) MyClass 
{ 
    public: 
     static bool m_someVar; 
} 

Par souci de clarté, je voudrais simplement répondre à cette m_someVar est définie/déclarée (oublier le terme) dans les classes fichier de mise en œuvre

+1

Can vous nous montrez les erreurs _exact_ et de préférence un code correspondant? –

+0

J'ai ajouté un exemple de classe de base, le code d'erreur est à peu près le même: 5> MyFile.obj: erreur LNK2001: symbole externe non résolu "privé: statique unsigned char MyClass :: m_someVar" (? M_someVare @ MyClass @@ 0EA) (réparé avec l'exemple ci-dessus) – Undawned

Répondre

5

Lorsque vous compilez le Core vous voulez que ces fonctions soient dllexport; Toutefois, lorsque vous compilez la DLL, vous voulez qu'ils soient dllimport. Dans votre cas, vous les définissez toujours comme dllexport, ainsi lorsque vous liez la DLL, elle se plaint que vous avez déclaré une fonction (et même déclaré que vous l'exporteriez) sans jamais la définir.

La solution est simple. Au lieu de __declspec manuellement ing, créer une macro selon que vous êtes le Core ou la DLL:

#ifndef I_AM_A_DLL 
#define EXPORT __declspec(dllexport) 
#define IMPORT __declspec(dllimport) 
#else 
#define EXPORT __declspec(dllimport) 
#define IMPORT __declspec(dllexport) 
#endif 

Utilisez EXPORT pour les fonctions dans le Core et IMPORT pour les fonctions dans les DLL externes:

class EXPORT MyClass 
{ 
    public: 
     static bool m_someVar; 
} 
0

Peut-être une question idiote mais la définissez-vous quelque part? Votre définition ressemblerait à quelque chose comme:

bool MyClass::m_someVar = false; 
+0

Oui, cela est fait dans le fichier d'implémentation de la classe. – Undawned

2

Utilisation de votre extrait et en cours d'exécution Dumpbin.exe/exports sur la DLL produit cette sortie:

1 0 0001107D [email protected]@[email protected]@@Z = @ILT+120([email protected]@[email protected]@@Z) 
2 1 00017000 [email protected]@@2_NA = [email protected]@@2_NA (public: static bool MyClass::m_someVar) 

Notez comment l'exportation pour l'organe statique est là, mais a un nom subtilement différent du vôtre. Si j'exécute votre nom d'exportation via undname.exe, j'obtiens:

Undecoration of :- "[email protected]@@0EA" 
is :- "private: static unsigned char MyClass::m_someVare" 

Notez la différence. Vous avez une macro maléfique dans votre projet cible. Résoudre votre problème en ajoutant ceci au fichier d'en-tête:

#undef bool 

Cela pourrait avoir des effets secondaires :)

+0

Pas vraiment sûr que je suis, la macro utilisée dans mon projet est essentiellement SOME_DLL_EXPORT __declspec (dllexport) – Undawned

+0

@Undawned: non, c'est une macro utilisée dans le projet cible. Recherchez "#define bool unsigned char" dans l'un des fichiers d'en-tête. Cette macro bousille votre déclaration de classe. –

Questions connexes