CRT-Bibliotheks-Funktionen
In diesem Thema erläutert die verschiedenen LIB-Dateien, die die C-Laufzeitbibliotheken sowie ihre zugehörigen Compileroptionen und Präprozessordirektiven bilden.
C-Laufzeitbibliotheken (CRT)
Die folgenden Bibliotheken enthalten die Funktionen der C-Laufzeitbibliothek.
C-Laufzeitbibliothek (ohne Iostream oder standard C++ Library) |
Zugehörige DLL |
Eigenschaften |
Option |
Präprozessordirektiven |
---|---|---|---|---|
LIBCMT.lib |
Keine, static Link. |
Multithreading, statische Verknüpfung |
_MT |
|
Msvcrt.lib |
msvcr110.dll |
Multithreading, dynamische Verknüpfung (Importbibliothek für MSVCR110.(DLL).Beachten Sie, dass wenn Sie C++-Standardbibliothek verwenden, Ihr Programm MSVCP110 muss.DLL zur Programmausführung. |
_MT, _DLL |
|
LIBCMTD.lib |
Keine statische Verknüpfung |
Multithreading, statische Verknüpfung (Debug) |
/MTd |
_DEBUG, _MT |
MSVCRTD.lib |
msvcr110d.dll |
Multithreading, dynamische Verknüpfung (Importbibliothek für MSVCR110D.(DLL) (Debug). |
/MDd |
_DEBUG, _MT, _DLL |
msvcmrt.lib |
Keine statische Verknüpfung |
Statische C Runtime-Bibliothek.Für gemischten verwalteten/systemeigenen Code verwendet. |
/clr /clr:oldSyntax |
|
Msvcurt.lib |
Keine statische Verknüpfung |
Statische Bibliothek mit C-Laufzeit als 100 % pure-MSIL-Code kompiliert.Alle Code entspricht der Spezifikation ECMA-URT für MSIL. |
/clr:pure |
|
Hinweis |
---|
CRT Singlethreaded (libc.lib, libcd.lib) (früher die /ML oder /MLd Optionen) ist nicht mehr verfügbar.Verwenden Sie stattdessen die multithreaded CRT.Weitere Informationen finden Sie unter Das Bibliotheks-Leistung. |
Wenn Sie Ihr Programm über die Befehlszeile ohne eine Compileroption, die eine C-Laufzeitbibliothek angibt verknüpfen, verwendet der Linker LIBCMT.LIB.Dies unterscheidet sich von früheren Versionen von Visual C++ die LIBC verwendet.LIB, Single-Thread-Bibliothek statt.
Verwendung der statisch verknüpften CRT bedeutet, dass alle Zustandsinformationen, die von der C-Laufzeit-Bibliothek gespeichert lokal auf diese Instanz des CRT ist.Angenommen, Sie verwenden strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l bei Verwendung der statisch verknüpfte CRT, die Position des der strtok Parser ist unabhängig von der strtok Zustand mit Code in demselben Prozess (aber in einer anderen DLL oder EXE), die an eine andere Instanz der statischen CRT verknüpft ist.Im Gegensatz dazu teilt die dynamisch verknüpfte CRT Status für den gesamten Code innerhalb eines Prozesses, das dynamisch mit der CRT verknüpft ist.Dieses Problem gilt nicht, wenn Sie die neuen sichereren Versionen dieser Funktionen verwenden; z. B. strtok_s hat dieses Problem nicht.
Da eine DLL, die durch Verknüpfen mit einer statischen CRT erstellt seinen eigenen CRT-Zustand haben, empfiehlt es sich nicht mit der CRT in einer DLL statisch verknüpft, es sei denn, die Konsequenzen dieser speziell gewünschten und verstanden werden.Wenn Sie aufrufen, beispielsweise _set_se_translator in eine ausführbare Datei, die Lasten DLL verknüpft, um eine eigene statische CRT, Hardwareausnahmen generiert, durch den Code in der DLL werden vom Übersetzer nicht abgefangen werden, aber Hardwareausnahmen, die durch Code in die ausführbare Hauptdatei generiert werden abgefangen werden.
Verwenden Sie die /clr -Compilerschalter, wird Ihr Code mit verknüpft eine statische Bibliothek, msvcmrt.lib.Die statische Bibliothek stellt eines Proxys zwischen verwaltetem Code und systemeigenen CRT.Sie können nicht statisch verknüpfte CRT verwenden ( /MT oder /MTd Optionen) mit /clr.Verwenden Sie die dynamisch verknüpfte Bibliotheken (/MD oder /MDd) statt.
Verwenden Sie die /clr:pure -Compilerschalter, Code mit der statischen Bibliothek msvcurt.lib verknüpft werden sollen.Wie bei /clr, Sie können keine Verknüpfung mit der statisch verknüpfte Bibliothek.
Weitere Informationen zum Verwenden der CRT mit /clr, finden Sie unter Gemischte (systemeigene und verwaltete) Assemblys; for /clr:pure, see Reiner und überprüfbarer Code (C++/CLI).
Erstellen eine Debugversion der Anwendung, die _DEBUG Flag muss definiert werden, und die Anwendung muss mit einer Debugversion einer dieser Bibliotheken verknüpft werden.Weitere Informationen über die Verwendung der Debugversionen der Bibliotheksdateien finden Sie unter CRT-Debugverfahren.
Diese Version von Visual C++ ist nicht konform mit der C99-Standard.
C++-Standardbibliothek
C++-Standardbibliothek |
Eigenschaften |
Option |
Präprozessordirektiven |
---|---|---|---|
LIBCPMT.LIB |
Multithreading, statische Verknüpfung |
/MT |
_MT |
MSVCPRT.LIB |
Multithreading, dynamische Verknüpfung (Importbibliothek für MSVCP110.dll) |
/MD |
_MT, _DLL |
LIBCPMTD.LIB |
Multithreading, statische Verknüpfung |
/MTd |
_DEBUG, _MT |
MSVCPRTD.LIB |
Multithreading, dynamische Verknüpfung (Importbibliothek für MSVCP110D.(DLL) |
/MDd |
_DEBUG, _MT, _DLL |
Hinweis LIBCP.LIB und LIBCPD.LIB (über die alte /ML und /MLd Optionen) wurden entfernt.Verwenden Sie LIBCPMT.LIB und LIBCPMTD.LIB stattdessen über die /MT und /MTd Optionen.
Beim Erstellen einer Releaseversion des Projekts, eines der grundlegenden C-Laufzeitbibliotheken (LIBCMT.LIB, MSVCRT.LIB.LIB, MSVCRT.LIB) standardmäßig verknüpft ist, hängt von der Compileroption Sie wählen (multithreaded-DLL, / CLR).Wenn Sie eine der enthalten die Headerdateien in Ihrem Code ein C++-Standardbibliothek verknüpft werden sollen automatisch von Visual C++ zum Zeitpunkt der Kompilierung.Beispiele:
#include <ios>
Was ist der Unterschied zwischen msvcrt.dll und msvcr110.dll?
Die msvcrt.dll ist jetzt ein "bekannten DLL," Was bedeutet, dass es eine Systemkomponente gehört und von Windows integriert ist.Es ist nur durch System-Level-Komponenten für die zukünftige Verwendung vorgesehen.
Welche Probleme gibt es, wenn eine Anwendung msvcrt.dll und msvcr110.dll verwendet?
Haben Sie eine lib oder OBJ-Datei, die mit msvcrt.lib verknüpft werden muss, haben Sie nicht mit neuen msvcrt.lib in Visual C++ zu kompilieren.Die lib oder OBJ-Datei kann auf die Größen, Feldoffsets oder Funktion Membernamen der verschiedenen CRT-Klassen oder Variablen stützen und die sollten alle noch in einer kompatiblen Weise.Wenn Sie gegen msvcrt.lib verknüpfen, haben Ihre endgültige exe- und DLL-Bild nun eine Abhängigkeit auf msvcr110.dll anstelle von msvcrt.dll.
Wenn Sie mehr als einer DLL oder EXE, dann mehr als ein CRT, haben eventuell ob Sie verschiedene Versionen von verwenden Visual C++.Statische Verknüpfung von CRT in mehrere DLLs kann z. B. das gleiche Problem angezeigt werden.Dieses Problem mit statischen CRTs stoßen Entwickler wurde angewiesen, die Kompilierung mit /MD der CRT-DLL zu verwenden.Nun, da die CRT-DLL in msvcr110.dll umbenannt wurde, möglicherweise Anwendungen einige Komponenten verknüpft msvcrt.dll und andere msvcr110.dll.Wenn Ihre DLLs CRT-Ressourcen über die msvcrt.dll und msvcr110.dll hinweg übergeben, Sie treten Probleme mit nicht übereinstimmenden CRT-Monitore und das Projekt mit Visual C++ neu kompilieren müssen.
Wenn Ihr Programm mehr als eine Version der CRT verwendet wird, wird einige Sorgfalt benötigt beim Übergeben von bestimmten CRT-Objekten (z. B. Dateihandles, Gebietsschemas und Umgebungsvariablen) hinweg DLL.Weitere Informationen über die Probleme und deren Behebung finden Sie unter Mögliche Fehler, die CRT-Objekte über DLL-Grenzen übergeben.