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).
/verbose:lib
, die zusätzlichen Linker-Optionen zu ergänzen . Es zeigt die Reihenfolge, in der .lib-Dateien geladen werden, so dass Sie sehen können, wo die falsche eingezogen wurde.Dies bedeutet, dass eine der abhängigen DLLs mit einer anderen Laufzeitbibliothek kompiliert wird .
Projekt -> Eigenschaften -> C / C ++ -> Codegenerierung -> Laufzeitbibliothek
Sehen Sie sich alle Bibliotheken an und stellen Sie sicher, dass sie auf dieselbe Weise kompiliert werden.
Mehr zu diesem Fehler in diesem Link:
Warnung LNK4098: Die Standardlib "LIBCD" steht in Konflikt mit der Verwendung anderer Bibliotheken
quelle
IMO war dieser Link von Yochai Timmer sehr gut und relevant, aber schmerzhaft zu lesen. Ich habe eine Zusammenfassung geschrieben.
Yochai, wenn Sie dies jemals gelesen haben, lesen Sie bitte den Hinweis am Ende.
Für den ursprünglichen Beitrag lesen Sie: Warnung LNK4098: Die Standardlib "LIBCD" steht in Konflikt mit der Verwendung anderer Bibliotheken
Error
Bedeutung
Wie zu lösen
In letzterem können, wie im ursprünglichen Beitrag erwähnt, zwei häufige Probleme auftreten:
Stellen Sie in diesen Fällen sicher, dass Sie das Problem verstehen und entscheiden Sie sich für eine der Lösungen.
Hinweis: Ich wollte diese Zusammenfassung von Yochai Timmers Link in seine eigene Antwort aufnehmen, aber da einige Leute Probleme haben, Änderungen richtig zu überprüfen, musste ich sie in eine separate Antwort schreiben. Es tut uns leid
quelle
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 "Multithread-Debug (/ MTd)" für die Debug-Konfiguration.
Beachten Sie, dass dies die Einstellung für Ihre Release-Konfiguration nicht ändert. Sie müssen an denselben Speicherort gehen und "Multi-Threaded (/ MT)" für Release auswählen.
quelle
Klicken Sie mit der rechten Maustaste auf das Projekt, wählen Sie Eigenschaften und dann unter 'Konfigurationseigenschaften | Linker | Eingabe | Ignorieren Sie eine bestimmte Bibliothek und schreiben Sie msvcrtd.lib
quelle