Question

J'ai une solution avec plusieurs projets. J'ai un " main " projet, qui agit comme un menu et à partir de là, l’utilisateur peut accéder à n’importe quel autre projet. Sur ce projet principal, je reçois des erreurs de l'éditeur de liens pour chaque fonction appelée. Comment puis-je éviter ces erreurs de l'éditeur de liens? J'ai déjà défini les dépendances de projet dans "Dépendances de projet ...". dialogue.

Merci

EDIT - J'ai suivi les instructions et ajouté le dossier de sortie aux répertoires supplémentaires de l'éditeur de liens. Maintenant, cependant, j'ai 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)
Était-ce utile?

La solution

Sans connaître le moindre détail de votre solution, il est difficile de le savoir. Cependant, reconstruire tout pourrait être utile. Cette situation peut parfois se produire lorsqu'il existe des fichiers d'objet mélangés pour différentes architectures.

Vous pouvez également envisager d'utiliser " Références " au lieu de "Dépendances"

EDIT:

Après ce que vous avez publié, il semble que votre lien avec les bibliothèques standard soit incohérent. Se pourrait-il que l'un des projets relie les bibliothèques standard statiquement pendant que d'autres dynamiquement? (Voir les propriétés du projet - > éditeur de liens) Ou un à la version d'exécution, tandis que d'autres à déboguer? (Bien que le dernier soit possible, avec des réserves)

Autres conseils

Il est difficile de répondre sans connaître tous les détails de votre solution, mais je supposerai que votre "autre" projet sont configurés pour produire un fichier .lib, et le projet principal relie ensuite tous ces fichiers lib. Si tel est le cas, une des causes possibles des erreurs que vous obtenez est que vos projets sont liés à différentes versions de la bibliothèque d'exécution.

De la documentation de Microsoft , "Tous les modules passés à un appel donné de l'éditeur de liens doivent avoir été compilés avec la même option du compilateur de la bibliothèque d'exécution (/ MD, / MT, / LD)."

Essayez de modifier tous les projets pour qu'ils utilisent la même version de la bibliothèque d'exécution. Dans Visual Studio 2010, cela se trouve dans les propriétés du projet | Propriétés de configuration | C / C ++ | Génération de code | Bibliothèque d'exécution. Choisissez DLL de débogage multithread ou Débogage multithread (pour votre configuration de débogage).

Les fonctions de vos autres projets sont-elles exportées? S'ils ne sont pas exportés, il n'y a rien à relier depuis l'exe principal, ce qui causerait des erreurs. Voir Exportation à partir d'une DLL à l'aide de __declspec (export) pour plus d'informations.

Les erreurs que vous obtenez sont les "erreurs LNK2005" dans lesquelles un symbole dans la bibliothèque que vous liez (msvcprtd.lib) a déjà été défini dans une autre bibliothèque (par exemple panneaux.lib). Si vous ajoutez panels.lib au champ "ignorer une bibliothèque spécifique" (dans Propriétés de configuration de VS2008 - > Linker - > Entrée - > Ignorer des bibliothèques spécifiques), les erreurs cesseront.

Je suppose que les erreurs de l'éditeur de liens que vous obtenez concernent des "symboles non résolus"?

Si vous utilisez des bibliothèques statiques (c'est-à-dire un fichier .lib), vous devrez ajouter la bibliothèque à l'entrée de l'éditeur de liens afin que les symboles puissent être liés au moment de la liaison. Si vous ne le faites pas, vous obtiendrez un symbole non résolu:

  1. Cliquez sur le projet avec le bouton droit de la souris et sélectionnez Propriétés.
  2. Sélectionnez les propriétés de configuration - > Éditeur de liens- > Entrée
  3. Entrez le nom de la bibliothèque (par exemple, nomfichier.lib) sous Dépendances supplémentaires.

J'ai eu un problème très similaire à celui-ci, car l'une de mes bibliothèques avait l'option "Traiter wchar_t comme type intégré" définie sur une valeur différente de celle des autres. Ce paramètre est faux par défaut sur les nouveaux projets. Changer tout en vrai a résolu le problème.

Exactement, au moins un de vos projets est compilé avec une autre "bibliothèque d'exécution". puis les autres. Peut-être en avez-vous ajouté un nouveau en utilisant la valeur par défaut qui est différente. Vérifiez les propriétés de vos projets pour une 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 dû au fait que j'avais conservé les prototypes de fonctions, les définitions de classes, l'implémentation de fonctions et l'implémentation de classes dans un seul fichier cpp. Ce n'est que lorsque j'ai déplacé les déclarations et les prototypes dans un fichier d'en-tête séparé que ces erreurs ont disparu. Vraiment bizarre!

Dans mon cas, j'ai deux méthodes:

  1. Propriétés du projet - > C / C ++ - > Génération de code - > Bibliothèque d'exécution. changez-le en MT.

  2. Ajoutez votre bibliothèque de manques à: Linker- > Entrée - > Dépendances supplémentaires. Si cela ne fonctionne pas, essayez d’ajouter un chemin complet au lieu d’un nom de bibliothèque.

Par exemple: C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ lib \ amd64 \ libvcruntime.lib;

Cela fonctionne pour moi. Répondez à cette question si quelqu'un a besoin d'aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top