Erreurs de lien entre plusieurs projets dans Visual C ++
J'ai une solution avec plusieurs projets. J'ai un "principal" du projet, qui agit comme un menu et à partir de là, l'utilisateur peut accéder à toutes les autres projets. Sur ce projet, j'obtiens des erreurs d'édition de liens pour chaque fonction appelée. Comment puis-je éviter ces erreurs d'édition de liens? J'ai mis les dépendances d'un projet déjà dans le "Projet de Dépendances..." boîte de dialogue.
Grâce
EDIT -- j'ai fait comme l'a suggéré et ajouté le dossier de sortie de l'éditeur de liens d'autres répertoires. Maintenant, cependant, je reçois un million d'erreurs comme suit:
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputn(char const *,int)" (?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static bool __cdecl std::char_traits::eq_int_type(int const &,int const &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int __cdecl std::char_traits::eof(void)" (?eof@?$char_traits@D@std@@SAHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputc(char)" (?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_streambuf > * __thiscall std::basic_ios >::rdbuf(void)const " (?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char __thiscall std::basic_ios >::fill(void)const " (?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::flags(void)const " (?flags@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(void)const " (?width@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static unsigned int __cdecl std::char_traits::length(char const *)" (?length@?$char_traits@D@std@@SAIPBD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > & __thiscall std::basic_ostream >::flush(void)" (?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > * __thiscall std::basic_ios >::tie(void)const " (?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " (?good@ios_base@std@@QBE_NXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ostream >::_Osfx(void)" (?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Lock(void)" (?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) already defined in panels.lib(panel_main.obj)
3>libcpmtd.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" (?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" (?_Addstd@ios_base@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" (?_AtModuleExit@@YAXP6AXXZ@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: __Fac_tidy already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static void __cdecl std::locale::facet::facet_Register(class std::locale::facet *)" (?facet_Register@facet@locale@std@@CAXPAV123@@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" (?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" (?_Init@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,class std::basic_string,class std::allocator > const &)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" (?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
source d'informationauteur rlbond
Vous devez vous connecter pour publier un commentaire.
Sans connaître d'autres détails au sujet de votre solution c'est dur à dire, cependant Tout Reconstruire, pourrait être utile. Cette situation peut parfois se produire lorsqu'il y a mélangé les fichiers objets pour différentes architectures.
Vous pouvez également envisager d'utiliser des "Références" au lieu de "Dépendances"
EDIT:
Après que vous avez posté, il semble que votre lien de bibliothèques standard est incohérent. Se pourrait-il que l'un des projets les liens des bibliothèques standard de manière statique, tandis que d'autres dynamiquement? (Voir les propriétés du projet->linker) Ou l'un à la sortie de l'exécution, tandis que d'autres débogage? (bien que la dernière devrait être possible, avec des réserves)
Il est difficile de répondre sans connaître tous les détails au sujet de votre solution, mais je vais supposer que votre "autres" sont mis en place pour produire une .fichier lib, et le projet principal, puis les liens entre toutes ces fichiers lib. Si c'est le cas, alors une cause possible pour les erreurs que vous obtenez est que vos projets en lien avec les différentes versions de la bibliothèque d'exécution.
De La documentation de Microsoft"Tous les modules passé à une invocation de l'éditeur de liens doit avoir été compilé avec la même bibliothèque d'exécution de l'option de compilateur (/MD /MT /LD)."
Essayer de changer tous les projets visant à utiliser la même version de la bibliothèque d'exécution. Dans Visual Studio 2010, c'est dans les Propriétés du Projet | Propriétés de Configuration | C/C++ | Génération de Code | la Bibliothèque d'Exécution. Choisissez multithread DLL de Débogage ou Multi-threaded Debug (pour votre configuration de débogage).
Sont les fonctions dans vos autres projets exportés? Si elles ne sont pas exportées, alors il n'y a rien de faire un lien à partir du programme principal, de sorte que serait la cause de l'erreur. Voir L'exportation à partir d'une DLL à l'Aide de __declspec(exportation) pour plus d'informations.
Les erreurs que vous obtenez sont 'error LNK2005' où un symbole dans la bibliothèque, vous créez un lien (msvcprtd.lib) a déjà été définie dans une autre bibliothèque (par exemple des panneaux.lib). Si vous ajoutez des panneaux.lib à la " ignorer spécifiques de la bibliothèque de champ (dans VS2008 Propriétés de Configuration--> Linker--> Input -->Ignorer certaines bibliothèques), les erreurs d'arrêt.
Je suppose que l'éditeur de liens erreurs que vous obtenez "en suspens symboles"?
Si l'aide de bibliothèques statiques (c'est à dire .fichier lib), vous devrez ajouter à la bibliothèque de l'éditeur de liens d'entrée, de sorte que le couplage de temps les symboles peuvent être liées. Si vous ne le faites pas, vous obtiendrez un symbole non résolu:
J'ai eu un problème similaire à ce qui s'est avéré être parce que l'un de mes bibliothèques avait l'option "Traiter wchar_t comme type' définie sur une valeur différente pour les autres. Ce paramètre est false par défaut sur de nouveaux projets. Changement de tous à vrai résolu le problème.
Exactement, au moins l'un de vos projets est compilé avec un autre "Runtime Library", puis les autres. Peut-être que vous avez ajouté un nouveau en utilisant la valeur par défaut qui est différent. Vérifiez les propriétés de votre projet(s) de valeur égale "Propriétés de Configuration" -> "C/C++" -> "Génération de Code" -> "Bibliothèque d'Exécution".
Dans mon cas, le problème était que j'avais gardé les prototypes de fonction, les définitions de classe et la fonction de la mise en œuvre et l'implémentation de la classe dans un seul fichier cpp. Seulement quand j'ai changé les déclarations et les prototypes d'un fichier d'en-tête n'ces erreurs disparaissent. Vraiment bizarre!