visual studio - Auflösen von LNK4098: defaultlib 'MSVCRT' steht in Konflikt mit




visual-studio dll (4)

Diese Warnung:

LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts
  with use of other libs; use /NODEFAULTLIB:library

ist eine ziemlich häufige Warnung in Visual Studio. Ich würde gerne den genauen Grund dafür und den richtigen Weg (wenn überhaupt) verstehen, um damit umzugehen.

Dies kommt in einem Debug-Build, kompiliert mit /MDd . Das Projekt ist mit Dingen wie windows Version.dll und pdh.dll die selbst mit MSVCRT.dll . Offensichtlich habe ich die Debug-Versionen von diesen nicht und kann sie nicht kompilieren.

Also habe ich /NODEFAULTLIB:MSVCRT der Linker-Befehlszeile hinzugefügt und die Warnung tatsächlich entfernt. Aber was macht das eigentlich? Und warum ist es notwendig?



Es gibt 4 Versionen der CRT-Link-Bibliotheken in vc \ lib:

  • libcmt.lib: statische CRT-Link-Bibliothek für einen Release-Build (/ MT)
  • libcmtd.lib: statische CRT-Link-Bibliothek für einen Debug-Build (/ MTd)
  • msvcrt.lib: Importbibliothek für die Release-DLL-Version des CRT (/ MD)
  • msvcrtd.lib: Importbibliothek für die Debug-DLL-Version des CRT (/ MDd)

Sehen Sie sich die Linker-Optionen, Projekt + Eigenschaften, Linker, Befehlszeile an. Beachten Sie, wie diese Bibliotheken hier nicht erwähnt werden. Der Linker ermittelt automatisch, welcher / M-Schalter vom Compiler benutzt wurde und welche .lib durch eine #pragma-Kommentar-Direktive verbunden werden sollte. Ein bisschen wichtig, Sie würden schreckliche Link-Fehler und schwer zu diagnostizieren Runtime-Fehler, wenn es einen Konflikt zwischen der Option / M und der. Lib, mit der Sie verknüpfen.

Sie sehen die Fehlermeldung, die Sie angegeben haben, als der Linker aufgefordert wurde, beide mit msvcrt.lib und libcmt.lib zu verknüpfen. Was passiert, wenn Sie Code, der mit / MT kompiliert wurde, mit Code verknüpfen, der mit / MD verknüpft wurde. Es kann nur eine Version des CRT geben.

/ NODEFAULTLIB weist den Linker an, die # pragma-Kommentardirektive zu ignorieren, die aus dem kompilierten / MT-Code generiert wurde. Dies könnte funktionieren, obwohl eine Reihe anderer Linker-Fehler nicht ungewöhnlich sind. Dinge wie errno , das ist ein externes int in der statischen CRT-Version, aber Makro-ed auf eine Funktion in der DLL-Version. Viele andere mögen das.

Nun, beheben Sie dieses Problem auf die richtige Weise, finden Sie die .obj oder .lib-Datei, die Sie verknüpfen, die mit der falschen / M-Option kompiliert wurde. Wenn Sie keine Ahnung haben, können Sie es finden, indem Sie die .obj / .lib-Dateien für "/ MT"

Btw: die ausführbaren Windows-Dateien (wie version.dll) haben ihre eigene CRT-Version, um ihre Arbeit zu erledigen. Es befindet sich in c: \ windows \ system32, Sie können es nicht zuverlässig für Ihre eigenen Programme verwenden, seine CRT-Header sind nirgendwo verfügbar. Die CRT-DLL, die von Ihrem Programm verwandt wird, hat einen anderen Name (wie msvcrt90.dll).


Ich bekomme dies jedes Mal, wenn ich eine Anwendung in VC ++ erstellen möchte.

Klicken Sie mit der rechten Maustaste auf das Projekt, wählen Sie Eigenschaften und dann unter 'Konfigurationseigenschaften | C / C ++ | Codegenerierung ', wählen Sie "Multi-threaded Debug (/ MTd)" für die Debug-Konfiguration.

Beachten Sie, dass dies die Einstellung für Ihre Release-Konfiguration nicht ändert. Sie müssen zum selben Speicherort gehen und "Multi-threaded (/ MT)" für Release auswählen.


Klicken Sie mit der rechten Maustaste auf das Projekt, wählen Sie Eigenschaften und dann unter 'Konfigurationseigenschaften | Linker | Eingabe | Ignoriere spezifische Bibliothek und schreibe msvcrtd.lib