2010-07-08 16 views
5

Als mein dll in Release-Build Verknüpfung ich -VC++/defaultlib Ausgabe

1> LINK: Warnung LNK4098: defaultlib 'mfc80d.lib' Konflikte mit der Verwendung von anderen Libs; Verwendung/NODEFAULTLIB: Bibliothek

1> LINK: Warnung LNK4098: defaultlib 'mfcs80d.lib' Konflikte mit der Verwendung von anderen Libs; Verwendung/NODEFAULTLIB: Bibliothek

1> LINK: Warnung LNK4098: defaultlib 'MSVCRTD.lib' Konflikte mit der Verwendung von anderen Libs; Verwendung/NODEFAULTLIB: Bibliothek

Hinzufügen/VERBOSE, sehe ich die folgenden (Snippet): ...

1> D Suche: \ Microsoft Visual Studio 8 \ VC \ atlmfc \ lib \ mfc80d.lib:

1> gefunden "public: virtual __thiscall AFX_MODULE_STATE :: ~ AFX_MODULE_STATE (void)" (?? 1AFX_MODULE_STATE @@ UAE @ XZ) 1>
referenzierte in mfcs80.lib (dllmodul .obj) 1> Loaded mfc80d.lib (MFC80D.DLL)

1> Gefunden "long stdcall AfxWndProc (struct HWND__ *, unsigned int , unsigned int, long)" (? AfxWndProc @@ YGJPAUHWND __ @@ IIJ @ Z)

1> Referenced in mfcs80.lib (dllmodul.obj) 1> Loaded mfc80d.lib (MFC80D.DLL)

...

Wenn ich das richtig bin zu interpretieren, bedeutet der Linker irgendwie Anrufe aus dem (optimiert) Bibliothek mfcs80 löst, als Anrufe in die (nicht optimierten) Bibliothek mfc80D. Wie kann das sein??

Als ich hinzufügen /NODEFAULTLIB:mfc80d.lib die Warnungen sind weg, aber ich bin nicht ruhig mit ihm noch. Als Nebenwirkung ist das Modul in der Tat von sporadischen unerklärlichen Abstürzen auf dem Zwischen Links leiden, die nur durch ein Re-build gelöst werden. Ich verwende VS2005.

[Edit:] hat den Titel defaultlib aufzunehmen, hoffentlich besser das Thema konzentrieren. Ich tun eine explizite Linie sehen

verarbeitet /DEFAULTLIB:mfc80d.lib

im/VERBOSE Ausgang zu sagen, unter vielen anderen (nicht-debug) default Libs. Woher kommt das? Wie kann ich das beheben?

Danke!

Antwort

2

Das Problem wurde viel später gelöst - ich poste es hier für den Fall, dass es jemandem irgendwann hilft.

Es stellte sich heraus, dass es sich um einen falschen vorkompilierten Header-Pfad handelte: Die Release-Konfiguration zeigte auf den Standard-Debug-PCH-Pfad. Beim Übergang von Debug zu Release würde ein Build alle Debug-PCH-Inhalte mit sich ziehen - offensichtlich einschließlich einiger Debug-Versionen von MFC#pragma (Kommentar "lib ..") (enthalten in afx-Headern). Ein sauberer Build würde den PCH korrekt wieder aufbauen, aber wieder in den Debug-Ordner - wodurch identische Probleme beim Übergang zurück zum Debug-Build verursacht werden.

2

Sie sollten die Laufzeitbibliothek Einstellungen für Ihre Projekte überprüfen, klingt wie Sie einen Konflikt haben.In den Projekteinstellungen unter C/C++> Codegenerierung> Runtime-Bibliothek, Sie haben die Wahl:

  • Multi-Threaded
  • Multi-Threaded Debug
  • Multi-Threaded DLL
  • Multi-Threaded Debug
  • DLL

Es ist wie einige der Projekte in Ihrer Lösung klingt kann mit einer Debug-Version sein, während andere die Nicht-Debug-Version. Oder alternativ verwenden einige Projekte die Debug-Version, während andere die Debug-DLL-Version verwenden. Bei einer gegebenen Lösungskonfiguration möchten Sie, dass alle Projekte dieselbe Einstellung verwenden.

+0

Dank - aber ich überprüft alle Projekte (und alle einzelnen Dateien), und sie sind alle mit/MD zusammengestellt. Ich habe sehr wenige externe Abhängigkeiten: version.dll, shlwapi.dll und eine 3rd-Party-Komponente, die ich mit Abhängigkeit-Walker inspiziert und scheint mit den richtigen CRT-Versionen zu verknüpfen (nicht-debug). Ist der Schalter/MD tatsächlich der einzige Zugriff auf den Schalter/DEFAULTLIB? Gibt es nicht noch einen anderen Input, der es hätte durcheinander bringen können? –

0

Es bedeutet, dass eine der abhängigen DLLs mit einer anderen run-time library kompiliert wird.

Projekt -> Eigenschaften -> C/C++ -> Code-Generaion -> Runtime Library

Go über alle Bibliotheken und sieht, dass sie in der gleichen Art und Weise zusammengestellt werden.

Mehr über diesen Fehler in diesem Link:

warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs

+0

Als ich auf @bshields (identisch) antwort kommentierte, habe ich das vor dem Posten hier überprüft. Sehen Sie meine eigene (~ 1 Jahr später) Antwort für die mögliche Problemquelle. –