Frage

Ich habe eine Lösung mit mehreren Projekten. Ich habe ein „main“ Projekt, das als Menü wirkt und von dort aus kann der Benutzer eine der anderen Projekte zugreifen. Auf diesem Hauptprojekt, erhalte ich Linkerfehler für jede Funktion aufgerufen. Wie vermeide ich diese Linkerfehler? Ich habe die Projektabhängigkeiten bereits in den „Projektabhängigkeiten ...“ Dialog.

Danke

EDIT - Ich tue, wie Sie die Ausgabeordner an den Linker des zusätzlichen Verzeichnisse vorgeschlagen und hinzugefügt. Nun aber, bekomme ich eine Million Fehler wie folgt:

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)
War es hilfreich?

Lösung

Ohne andere Details über Ihre Lösung zu wissen, ist es schwer zu sagen ist, aber Alles neu erstellen, könnte hilfreich sein. Diese Situation kann manchmal auftreten, wenn es gemischte Objektdateien für verschiedene Architekturen.

Sie können auch wollen, mit „Referenzen“ statt „Abhängigkeiten“

betrachten

EDIT:

Nach dem, was Sie gebucht haben es scheint, dass Ihre Bindung an Standardbibliotheken unvereinbar ist. Könnte es sein, dass einer der Projekt Links Standardbibliotheken statisch, während andere dynamisch sein? (Siehe Projekt Eigenschaften-> Linker) Oder man zur Freisetzung Laufzeit, während andere zu debuggen? (Obwohl die letzten sollte möglich sein, mit Einschränkungen)

Andere Tipps

Es ist schwer zu beantworten, ohne alle Details über Ihre Lösung zu wissen, aber ich werde Ihre „andere“ Projekt übernehmen eingerichtet sind, eine LIB-Datei zu erzeugen, und das Hauptprojekt verknüpft dann diese alle lib-Dateien. Wenn das der Fall ist, dann eine mögliche Ursache für die Fehler, die Sie erhalten, dass Ihre Projekte zu verschiedenen Versionen der Laufzeitbibliothek verknüpfen.

Microsofts Dokumentation , „Alle Module zu einem gegebenen Aufruf des Linken übergeben müssen mit der gleichen Laufzeitbibliothek-Compiler-Option kompiliert wurden (/ MD / MT, / LD).“

Versuchen Sie, alle Projekte zu ändern, um die gleiche Version der Laufzeitbibliothek zu verwenden. In Visual Studio 2010 ist dies in den Eigenschaften des Projekts | Konfigurationseigenschaften | C / C ++ | Code Generation | Laufzeitbibliothek. Wählen Sie entweder Multi-Threaded Debug DLL oder Multi-Threaded Debug (für Debug-Konfiguration).

Sind die Funktionen in Ihren anderen Projekten exportiert? Wenn sie nicht exportiert werden, dann gibt es nichts zu von der Haupt exe zu verbinden, so dass die Fehler verursachen würde. Siehe Exportieren von einem DLL __declspec (Export) für weitere Informationen.

Die Fehler, die Sie bekommen sind ‚Fehler LNK2005‘, wo ein Symbol in der Bibliothek Sie verknüpfen (MSVCPRTD.lib) bereits in einer anderen Bibliothek definiert (zum Beispiel panels.lib). Wenn Sie panels.lib auf die ‚ignorieren bestimmte Bibliothek‘ Feld hinzufügen (-> Linker - in VS2008 Konfigurationseigenschaften> Input -> Ignorieren spezifische Bibliotheken), stoppt die Fehler.

Ich nehme an die Linkerfehler Sie bekommen sind für „nicht aufgelöste Symbole“?

Bei der Verwendung von statischen Bibliotheken (d LIB-Datei), müssen Sie die Bibliothek an dem Linker Eingang hinzuzufügen, so dass bei Verknüpfung Zeit können die Symbole gegen verknüpft werden. Wenn Sie dies nicht tun, werden Sie ein ungelöstes Symbol bekommen:

  1. Rechtsklick auf das Projekt, und wählen Sie Eigenschaften.
  2. Wählen Sie Konfiguration Eigenschaften-> Linker-> Input
  3. Geben Sie den Namen der Bibliothek (z filename.lib) unter Zusätzliche Abhängigkeiten.

Ich hatte ein sehr ähnliches Problem dies die wegen einer meiner Bibliotheken die Möglichkeit hatte entpuppte ‚Treat wchar_t als integrierter Typ‘ auf einen anderen Wert zu den anderen. Diese Einstellung ist standardmäßig für neue Projekte falsch. Ändern sie alle wahr das Problem behoben.

Genau, mindestens eines Ihrer Projekte mit einer anderen „Runtime Library“ kompiliert dann die anderen. Vielleicht kannst du ein neues die den Standard verwenden, die anders ist. Überprüfen Sie Eigenschaften Ihres Projekts (e) für den gleichen Wert von "Konfigurationseigenschaften" -> "C / C ++" -> "Code Generation." -> "Runtime Library"

In meinem Fall war das Problem, weil ich die Funktionsprototypen gehalten hatte, die Klassendefinitionen und die Funktion Implementierung und die Klasse Implementierung in einer einzigen CPP-Datei. Erst wenn ich die Erklärungen und Prototypen in einen separaten Header-Datei verschoben haben diese Fehler verschwinden. Wirklich seltsam!

In meinem Fall, ich habe zwei Methoden:

  1. Projekteigenschaften -> C / C ++ -> Code Generation -..> Runtime Library ändern Sie es auf MT

  2. Fügen Sie Ihre fehlende Bibliothek.. Linker-> Input -> Zusätzliche Abhängigkeiten Wenn es nicht funktioniert, versuchen Sie einen vollständigen Pfad hinzuzufügen, anstelle eines Bibliotheksnamen

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

Das ist für me.Answer funktioniert diese Frage für alle, braucht Hilfe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top