In vc \ lib sind 4 Versionen der CRT-Linkbibliotheken vorhanden:
- libcmt.lib: statische CRT-Linkbibliothek für einen Release Build (/ MT)
- libcmtd.lib: statische CRT-Linkbibliothek für einen Debugbuild (/ MTd)
- msvcrt.lib: Importbibliothek für die Release-DLL-Version der CRT (/ MD)
- msvcrtd.lib: Importbibliothek für die Debug-DLL-Version der CRT (/ MDd)
Schauen Sie sich die Linker-Optionen, Projekt + Eigenschaften, Linker, Befehlszeile an. Beachten Sie, dass diese Bibliotheken hier nicht erwähnt werden. Der Linker ermittelt automatisch, welcher / M-Schalter vom Compiler verwendet wurde und welche .lib über eine # Pragma-Kommentaranweisung verknüpft werden soll. Ein bisschen wichtig, Sie würden schreckliche Linkfehler bekommen und Laufzeitfehler schwer zu diagnostizieren, wenn es eine Nichtübereinstimmung zwischen der / M-Option und der .lib gibt, mit der Sie verknüpfen.
Die von Ihnen angegebene Fehlermeldung wird angezeigt, wenn der Linker angewiesen wird, auf msvcrt.lib und libcmt.lib zu verlinken. 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 der CRT geben.
/ NODEFAULTLIB weist den Linker an, die # Pragma-Kommentaranweisung zu ignorieren, die aus dem / MT-kompilierten Code generiert wurde. Dies könnte funktionieren, obwohl eine Reihe anderer Linkerfehler nicht ungewöhnlich sind. Dinge wie errno , ein externes int in der statischen CRT-Version, das jedoch zu einer Funktion in der DLL-Version makro- bearbeitet wurde. Viele andere mögen das.
Beheben Sie dieses Problem auf die richtige Weise und suchen Sie die .obj- oder .lib-Datei, die Sie verknüpfen und die mit der falschen / M-Option kompiliert wurde. Wenn Sie keine Ahnung haben, können Sie sie finden, indem Sie die .obj / .lib-Dateien nach "/ MT" durchsuchen.
Übrigens: Die ausführbaren Windows-Dateien (wie version.dll) haben eine 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. Die CRT-Header sind nirgendwo verfügbar. Die von Ihrem Programm verwendete CRT-DLL hat einen anderen Namen (wie msvcrt90.dll).