CRT-Bibliotheksfunktionen

In diesem Thema werden die verschiedenen LIB-Dateien erläutert, die die C-Laufzeitbibliotheken sowie ihre zugeordneten Compileroptionen und Präprozessordirektiven bilden.

C-Laufzeitbibliotheken (CRT)

Die folgenden Bibliotheken enthalten die Funktionen der C-Laufzeitbibliotheken.

C-Laufzeitbibliothek (ohne iostream-Bibliothek oder Standard C++-Bibliothek)

Zugehörige DLL

Eigenschaften

Option

Präprozessordirektiven

libcmt.lib

Kein, statischer Link.

Multithreaded, statischer Link

/MT

_MT

msvcrt.lib

msvcr120.dll

Multithreaded, dynamischer Link (Importbibliothek für MSVCR120.DLL). Wenn Sie die C++-Standardbibliothek verwenden, benötigt das Programm MSVCP120.DLL, um ausgeführt zu werden.

/MD

_MT, _DLL

libcmtd.lib

Keine, statischer Link

Multithreaded, statischer Link (Debuggen)

/MTd

_DEBUG, _MT

msvcrtd.lib

msvcr120d.dll

Multithreaded, dynamischer Link (Importbibliothek für MSVCR120D.DLL) (Debuggen).

/MDd

_DEBUG, _MT, _DLL

msvcmrt.lib

Keine, statischer Link

Statische C-Laufzeitbibliothek (CRT) Wird für gemischt verwalteten/systemeigenen Code verwendet.

/clr

 

msvcurt.lib

Keine, statischer Link

Statische C-Laufzeitbibliothek, die als 100 % reiner MSIL-Code kompiliert ist. Sämtlicher Code entspricht den URT ECMA-Spezifikation für MSIL.

/clr:pure

 

Hinweis

Die Singlethread-CRT (libc.lib, libcd.lib) (zuvor die Option /ML oder /MLd) ist nicht mehr verfügbar.Verwenden Sie stattdessen die Multithread-CTR.Siehe Leistung von Multithreadbibliotheken.

Wenn Sie das Programm über die Befehlszeile ohne eine Compileroption verknüpfen, die die C-Laufzeitbibliothek angibt, verwendet der Linker LIBCMT.LIB. Dies unterscheidet sich von früheren Versionen von Visual C++, in denen stattdessen die Singlethread-Bibliothek LIBC.LIB verwendet wird.

Die Verwendung der statisch verknüpften CRT bedeutet, dass alle von der C-Laufzeitbibliothek gespeicherten Zustandsinformationen für diese CRT-Instanz lokal sind. Wenn Sie strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l bei einer statisch verknüpften CRT verwenden, steht die Position des strtok-Parsers nicht in Beziehung zu dem strtok-Zustand, der im Code des gleichen Prozesses (jedoch in einer anderen DLL oder einer EXE) verwendet wird, der mit einer anderen Instanz der statischen CRT verknüpft ist. Im Gegensatz dazu teilen dynamisch verknüpfte CRT den Zustand für sämtlichen Code innerhalb eines Prozesses, der dynamisch mit der CRT verknüpft ist. Bei den neuen sichereren Versionen dieser Funktionen wie strtok_s tritt dieses Problem nicht auf.

Da eine durch das Verknüpfen mit einer statischen CRT erstellten DLL ihren eigenen CRT-Zustand besitzt, wird in einer DLL das statische Verknüpfen mit einer CRT nicht empfohlen, es sei denn, dass die daraus resultierenden Konsequenzen verstanden werden und erwünscht sind. Wenn Sie z. B. _set_se_translator in einer ausführbaren Datei aufrufen, die die DLL lädt, die mit ihrer eigenen statischen CRT verknüpft ist, werden alle vom Code in der DLL generierten Hardwareausnahmen vom Konvertierungsprogramm nicht erfasst, wohingegen die vom Code in der Hauptausführungsdatei generierten Hardwareausnahmen erfasst werden.

Wenn Sie den /clr-Compilerschalter verwenden, wird der Code mit der statischen Bibliothek msvcmrt.lib verknüpft. Die statische Bibliothek stellt einen Proxy zwischen dem verwalteten Code und der systemeigenen CRT bereit. Die statisch verknüpfte CRT (Option /MT oder Option /MTd) können Sie nicht mit /clr verwenden. Verwenden Sie stattdessen die dynamisch verknüpften Bibliotheken (/MD oder /MDd).

Wenn Sie den /clr:pure-Compilerschalter verwenden, wird der Code mit der statischen Bibliothek msvcurt.lib verknüpft. Wie bei /clr können Sie keine Verknüpfung mit der statisch verknüpften Bibliothek erstellen.

Weitere Informationen zur Verwendung der CRT mit /clr finden Sie unter Gemischte (systemeigene und verwaltete) Assemblys; Informationen zu /clr:pure finden Sie unter Reiner und überprüfbarer Code (C++/CLI).

Um eine Debugversion der Anwendung zu erstellen, muss das _DEBUG-Flag definiert sein und die Anwendung muss mit einer Debugversion von einer dieser Bibliotheken verknüpft sein. Weitere Informationen zur Verwendung der Debugversionen der Bibliotheksdateien finden Sie unter CRT-Debugverfahren.

Diese Version von Visual C++ ist nicht mit dem Standard C99 konform.

C++-Standardbibliothek

C++-Standardbibliothek

Eigenschaften

Option

Präprozessordirektiven

LIBCPMT.LIB

Multithreaded, statischer Link

/MT

_MT

MSVCPRT.LIB

Multithreaded, dynamischer Link (Importbibliothek für MSVCP120.dll)

/MD

_MT, _DLL

LIBCPMTD.LIB

Multithreaded, statischer Link

/MTd

_DEBUG, _MT

MSVCPRTD.LIB

Multithreaded, dynamischer Link (Importbibliothek für MSVCP120D.DLL)

/MDd

_DEBUG, _MT, _DLL

Hinweis   LIBCP.LIB und LIBCPD.LIB (über die alten Optionen /ML und /MLd) wurden entfernt. Verwenden Sie stattdessen LIBCPMT.LIB und LIBCPMTD.LIB über die Optionen /MT und /MTd.

Wenn Sie eine Releaseversion des Projekts erstellen, wird abhängig von der ausgewählten Compileroption (Multithreaded, DLL, /clr) eine der grundlegenden C-Laufzeitbibliotheken (LIBCMT.LIB, MSVCMRT.LIB, MSVCRT.LIB) standardmäßig verknüpft. Wenn Sie eine der Headerdateien der C++-Standardbibliothek in den Code einfügen, wird von Visual C++ eine C++-Standardbibliothek automatisch zur Kompilierzeit eingebunden. Zum Beispiel:

#include <ios> 

Um die grundlegende C-Laufzeitbibliothek zu ändern, die in Visual Studio verknüpft ist, öffnen Sie die Eigenschaftenseiten für Ihr Projekt. Öffnen Sie die Konfigurationseigenschaften, C/C++, öffnen Sie die Seite Codegenerierung, und ändern Sie die Einstellung Laufzeitbibliothek. Um die Bibliothek für die Common Language Runtime zu ändern, öffnen Sie die Eigenschaftenseiten für Ihr Projekt. Öffnen Sie die Konfigurationseigenschaften, C/C++, öffnen Sie die Seite Allgemein, und ändern Sie die Einstellung Common Language Runtime-Unterstützung.

Was ist der Unterschied zwischen msvcrt.dll und msvcr120.dll?

Die msvcrt.dll ist derzeit eine "bekannte DLL". Das bedeutet, dass es eine Systemkomponente ist, die von Windows erstellt wurde und verwendet wird. In Zukunft soll sie nur noch von Komponenten auf Systemebene verwendet werden.

Welche Probleme gibt es, wenn eine Anwendung sowohl msvcrt.dll als auch msvcr120.dll verwendet?

Wenn Sie ein LIB- oder OBJ-Datei mit msvcrt.lib verknüpfen müssen, dann sollten Sie sie nicht neu kompilieren, damit sie mit der neuen msvcrt.lib in Visual C++ funktioniert. Die LIB- oder OBJ-Datei OBJ-Datei ist möglicherweise auf die Größen, Feldoffsets oder Memberfunktionsnamen verschiedener CRT-Klassen oder Variablen angewiesen, und diese sollten alle noch auf eine kompatible Weise vorhanden sein. Wenn Sie für msvcrt.lib eine neue Verknüpfung anlegen, weist Ihr endgültiges EXE- und DLL-Image anstelle einer Abhängigkeit von msvcrt.dll eine Abhängigkeit von msvcr120.dll auf.

Wenn Sie über mehr als einer DLL oder EXE-Dateien verfügen, dann verfügen Sie möglicherweise auch über mehr als eine CRT, unabhängig davon, ob Sie verschiedene Versionen von Visual C++ verwenden. Das statische Verknüpfen der CRT mit mehreren DLLs kann das gleiche Problem darstellen. Entwickler, bei denen dieses Problem mit statischen CRTs auftritt, sollen mit /MD kompilieren, um die CRT-DLL zu verwenden. Nachdem die CRT-DLL nun in msvcr120.dll umbenannt wurde, kann es vorkommen, dass einige Komponenten von Anwendungen mit msvcrt.dll und andere mit msvcr120.dll verknüpft sind. Wenn die DLLs CRT-Ressourcen über msvcrt.dll- und msvcr120.dll-Grenze übergeben, treten Probleme mit nicht übereinstimmenden CRTs auf, und Sie müssen das Projekt mit Visual C++ neu kompilieren.

Wenn das Programm mehr als eine CRT-Version verwendet, muss beim Übergeben bestimmter CRT-Objekte (wie z. B. Dateihandles, Gebietsschemas und Umgebungsvariablen) über DLL-Grenzen hinweg sorgfältig vorgegangen werden. Weitere Informationen zu den möglichen Problemen und deren Lösung finden Sie unter Potenzielle Fehler bei der Übergabe von CRT-Objekten über DLL-Grenzen.

Siehe auch

Weitere Ressourcen

C-Laufzeitbibliotheksverweis