OK, alors j'ai lu plusieurs questions et articles sur ce sujet, et je me sens comme si je comprends les bases, mais j'ai toujours des problèmes.
J'ai une DLL qui exporte une classe qui exporte une classe qui a un STD :: String en tant que membre. Mon programme principal contient des cours qui ont également des chaînes, et il utilise la DLL. P>
Si je compile la DLL au VS2010, je reçois les avertissements suivants: P>
#include <iostream> #include "SampleDLL.h" using namespace std; void main() { MyClass class1; cout << class1.getData() << endl; }
5 Réponses :
On dirait que vous voyez le problème décrit sur connect.microsoft.com . p>
Il y a une solution de contournement y a suggéré, mais il semble un peu méchant. P>
Autres options qui pourraient aider: P>
Merci. Cela semble certainement être le problème que je rencontrais. Façon de creuser un fil mort, mais une réponse est une réponse et c'est la première bonne explication que j'ai trouvée. J'espère que cela aide les autres!
Lien vers l'article que vous avez présenté indique que certaines classes STL "... sont déjà exportées par la DLL d'exécution C. Par conséquent, vous ne pouvez donc pas les exporter de votre DLL.". Y compris basique_string. Et votre erreur de liaison indique que le symbole Basic_string "... Déjà défini dans OtherClass.Obj". Parce que la lieur voit deux symboles égaux dans deux endroits différents. P>
Afin que vous puissiez décrire comment gérer avec base_string
Lorsque vous exportez STL STD :: Modèle de base_string de la DLL, je reçois une erreur LNK2005 P> blockQuote>
Voir également l'article de Microsoft's KB 168958 Article Comment exporter une instanciation d'une bibliothèque de modèles standard (STL ) Classe et une classe contenant un membre de données qui est un objet stl . De l'article: p>
à exporter une classe STL forte> p>
- Dans la DLL et le fichier .exe, lien avec la même version DLL du temps d'exécution C. Soit lier à la fois avec msvcrt.lib (version de version) ou Lier à la fois avec MSVCRTD.LIB (Build de débogage). Li>
- dans la DLL, fournissez le spécificateur __DeclSpec dans la déclaration d'instanciation de modèle pour exporter l'instanciation de classe STL de la dll. li>
- dans le fichier .exe, fournissez les spécificateurs externe et __declspec dans la déclaration d'instanciation de modèle pour importer la classe de la classe. Dll. Il en résulte une extension de l'avertissement C4231 "non standard utilisée: 'externe' avant l'instanciation explicite du modèle. "Vous pouvez ignorer cette AVERTISSEMENT. LI> ol> blockQuote>
J'ai un hack peut résoudre ce problème dans Options de projet Temp
Ouvrir, cliquez sur Linker-> Command Line,
Dans la zone de saisie d'options supplémentaires, tapez p>
Pour moi, tout le sujet fait bouillir jusqu'à p>
toujours corrigé le problème pour moi jusqu'à présent. P>
Malheureusement, ce n'est pas une réponse si vous n'avez aucun contrôle sur le code source, vous souhaitez créer un lien vers. P>
Dupliqué possible de Exportation de classes contenant STD :: Objets (Vecteur, carte, etc.) d'une DLL
Mark: J'ai lu cette question, mais cela ne semblait pas avoir une réponse à la question que je constate parce qu'il ne mentionne pas le problème supplémentaire du LNK2005 que j'ai maintenant.