CRT-BibliotheksfunktionenCRT Library Features

In diesem Thema werden die verschiedenen LIB-Dateien erläutert, die die C-Laufzeitbibliotheken sowie ihre zugeordneten Compileroptionen und Präprozessordirektiven bilden.This topic discusses the various .lib files that comprise the C run-time libraries as well as their associated compiler options and preprocessor directives.

C-Laufzeitbibliotheken (CRT)C Run-Time Libraries (CRT)

Die CRT (C Run-time Library, C-Laufzeitbibliothek) ist Bestandteil der C++-Standardbibliothek, die die ISO C99-Standardbibliothek umfasst.The C Run-time Library (CRT) is the part of the C++ Standard Library that incorporates the ISO C99 standard library. Die Visual C++-Bibliotheken, die die CRT implementieren, unterstützen die Entwicklung von nativem Code und Mischungen aus nativem und verwaltetem Code.The Visual C++ libraries that implement the CRT support native code development, and both mixed native and managed code. Alle Versionen der CRT unterstützen Multithreaded-Entwicklung.All versions of the CRT support multi-threaded development. Die meisten Bibliotheken unterstützen sowohl statisches Linken (Binden), um die Bibliothek direkt in Ihren Code einzubinden, oder dynamisches Linken, damit in Ihrem Code allgemeine DLL-Dateien verwendet werden können.Most of the libraries support both static linking, to link the library directly into your code, or dynamic linking to let your code use common DLL files.

Ab Visual Studio 2015 wurde die CRT in neue Binärdateien umgestaltet.Starting in Visual Studio 2015, the CRT has been refactored into new binaries. Die UCRT (Universal CRT) enthält die Funktionen und globalen Elemente, die durch die Standard-C99 CRT-Bibliothek exportiert werden.The Universal CRT (UCRT) contains the functions and globals exported by the standard C99 CRT library. Die UCRT ist nun eine Windows-Komponente und wird als Bestandteil von Windows 10 bereitgestellt.The UCRT is now a Windows component, and ships as part of Windows 10. Die statische Bibliothek, die DLL-Importbibliothek und die Headerdateien für die UCRT sind jetzt im Windows 10 SDK zu finden.The static library, DLL import library, and header files for the UCRT are now found in the Windows 10 SDK. Wenn Sie Visual C++ installieren, installiert Visual Studio-Setup die Teilmenge des Windows 10 SDKs, die erforderlich ist, um die UCRT verwenden zu können.When you install Visual C++, Visual Studio setup installs the subset of the Windows 10 SDK required to use the UCRT. Sie können die UCRT unter jeder Version von Windows verwenden, die von Visual Studio 2015 und späteren Versionen unterstützt wird.You can use the UCRT on any version of Windows supported by Visual Studio 2015 and later versions. Sie können die URCT über vcredist für unterstützte Versionen von Windows neu verteilen, die nicht Windows 10 sind.You can redistribute it using vcredist for supported versions of Windows other than Windows 10. Weitere Informationen finden Sie unter Redistributing Visual C++ Files.For more information, see Redistributing Visual C++ Files.

In der folgenden Tabelle sind die Bibliotheken aufgelistet, die die UCRT implementieren.The following table lists the libraries that implement the UCRT.

BibliothekLibrary Zugehörige DLLAssociated DLL EigenschaftenCharacteristics OptionOption PräprozessordirektivenPreprocessor directives
libucrt.liblibucrt.lib KeinerNone Bindet die UCRT statisch in Ihren Code ein.Statically links the UCRT into your code. /MT/MT _MT_MT
libucrtd.liblibucrtd.lib KeinerNone Die Debugversion der UCRT für statisches Linken.Debug version of the UCRT for static linking. Nicht neu verteilbar.Not redistributable. /MTd/MTd _DEBUG, _MT_DEBUG, _MT
ucrt.libucrt.lib ucrtbase.dllucrtbase.dll DLL-Importbibliothek für die UCRT.DLL import library for the UCRT. /MD/MD _MT, _DLL_MT, _DLL
ucrtd.libucrtd.lib ucrtbased.dllucrtbased.dll DLL-Importbibliothek für die Debugversion der UCRT.DLL import library for the Debug version of the UCRT. Nicht neu verteilbar.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

Die vcruntime-Bibliothek enthält Visual C++-CRT-implementierungsspezifischen Code, beispielsweise Ausnahmebehandlungs- und Debugunterstützung, Laufzeitprüfungen und Typinformationen, Implementierungsdetails und bestimmte erweiterte Bibliotheksfunktionen.The vcruntime library contains Visual C++ CRT implementation-specific code, such as exception handling and debugging support, runtime checks and type information, implementation details and certain extended library functions. Diese Bibliothek ist speziell entsprechend der Version des verwendeten Compilers.This library is specific to the version of the compiler used.

In der folgenden Tabelle sind die Bibliotheken aufgelistet, die die vcruntime-Bibliothek implementieren.This table lists the libraries that implement the vcruntime library.

BibliothekLibrary Zugehörige DLLAssociated DLL EigenschaftenCharacteristics OptionOption PräprozessordirektivenPreprocessor directives
libvcruntime.liblibvcruntime.lib KeinerNone Wird statisch in Ihren Code eingebunden.Statically linked into your code. /MT/MT _MT_MT
libvcruntimed.liblibvcruntimed.lib KeinerNone Die Debugversion für statisches Linken.Debug version for static linking. Nicht neu verteilbar.Not redistributable. /MTd/MTd _MT, _DEBUG_MT, _DEBUG
vcruntime.libvcruntime.lib vcruntime<Version>.dllvcruntime<version>.dll DLL-Importbibliothek für die vcruntime.DLL import library for the vcruntime. /MD/MD _MT, _DLL_MT, _DLL
vcruntimed.libvcruntimed.lib vcruntime<Version>d.dllvcruntime<version>d.dll DLL-Importbibliothek für die Debug-vcruntime.DLL import library for the Debug vcruntime. Nicht neu verteilbar.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

Hinweis

Beim UCRT-Refactoring wurden die Concurrency Runtime-Funktionen in die Datei „concrt140.dll“ verschoben, die dem C++ Redistributable Package hinzugefügt wurde.When the UCRT refactoring occurred, the Concurrency Runtime functions were moved into concrt140.dll, which was added to the C++ redistributable package. Diese DLL ist für parallele C++-Container und -Algorithmen wie concurrency::parallel_for erforderlich.This DLL is required for C++ parallel containers and algorithms such as concurrency::parallel_for. Darüber hinaus ist diese DLL unter Windows XP für die C++-Standardbibliothek zur Unterstützung von Synchronisierungsprimitiven erforderlich, da Windows XP über keine Bedingungsvariablen verfügt.In addition, the C++ Standard Library requires this DLL on Windows XP to support synchronization primitives, because Windows XP does not have condition variables.

Der Code, von dem die CRT initialisiert wird, befindet sich in einer von mehreren Bibliotheken, je nachdem, ob die CRT-Bibliothek statisch oder dynamisch gebunden wird oder als systemeigener, verwalteter oder gemischter Code vorliegt.The code that initializes the CRT is in one of several libraries, based on whether the CRT library is statically or dynamically linked, or native, managed, or mixed code. Dieser Code verwaltet den CRT-Start, die interne threadbezogene Dateninitialisierung und die Beendigung.This code handles CRT startup, internal per-thread data initialization, and termination. Der Code ist speziell entsprechend der Version des verwendeten Compilers.It is specific to the version of the compiler used. Diese Bibliothek wird immer statisch gebunden, auch wenn eine dynamisch gebundene UCRT verwendet wird.This library is always statically linked, even when using a dynamically linked UCRT.

In der folgenden Tabelle sind die Bibliotheken aufgelistet, die die CRT-Initialisierung und -Beendigung implementieren.This table lists the libraries that implement CRT initialization and termination.

BibliothekLibrary EigenschaftenCharacteristics OptionOption PräprozessordirektivenPreprocessor directives
LIBCMT.liblibcmt.lib Bindet den systemeigenen CRT-Startcode statisch in Ihren Code ein.Statically links the native CRT startup into your code. /MT/MT _MT_MT
libcmtd.liblibcmtd.lib Bindet die Debugversion des systemeigenen CRT-Startcode statisch ein.Statically links the Debug version of the native CRT startup. Nicht neu verteilbar.Not redistributable. /MTd/MTd _DEBUG, _MT_DEBUG, _MT
msvcrt.libmsvcrt.lib Statische Bibliothek für den systemeigenen CRT-Startcode zur Verwendung mit DLL UCRT und vcruntime.Static library for the native CRT startup for use with DLL UCRT and vcruntime. /MD/MD _MT, _DLL_MT, _DLL
msvcrtd.libmsvcrtd.lib Statische Bibliothek für die Debugversion des systemeigenen CRT-Startcodes zur Verwendung mit DLL UCRT und vcruntime.Static library for the Debug version of the native CRT startup for use with DLL UCRT and vcruntime. Nicht neu verteilbar.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL
msvcmrt.libmsvcmrt.lib Statische Bibliothek für den gemischten systemeigenen und verwalteten CRT-Startcode zur Verwendung mit DLL UCRT und vcruntime.Static library for the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. /clr/clr
msvcmrtd.libmsvcmrtd.lib Statische Bibliothek für die Debugversion des gemischten systemeigenen und verwalteten CRT-Startcodes zur Verwendung mit DLL UCRT und vcruntime.Static library for the Debug version of the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. Nicht neu verteilbar.Not redistributable. /clr/clr
msvcurt.libmsvcurt.lib Veraltet Statische Bibliothek für die ausschließlich verwaltete CRT.Deprecated Static library for the pure managed CRT. /clr:pure/clr:pure
msvcurtd.libmsvcurtd.lib Veraltet Statische Bibliothek für die Debugversion der ausschließlich verwalteten CRT.Deprecated Static library for the Debug version of the pure managed CRT. Nicht neu verteilbar.Not redistributable. /clr:pure/clr:pure

Wenn Sie Ihr Programm über die Befehlszeile ohne eine Compileroption verknüpfen, die die C-Laufzeitbibliothek angibt, verwendet der Linker die statisch verknüpften CRT-Bibliotheken: „libcmt.lib“, „libvcruntime.lib“ und „libucrt.lib“.If you link your program from the command line without a compiler option that specifies a C run-time library, the linker will use the statically linked CRT libraries: libcmt.lib, libvcruntime.lib, and libucrt.lib.

Die Verwendung der statisch verknüpften CRT bedeutet, dass alle von der C-Laufzeitbibliothek gespeicherten Zustandsinformationen für diese CRT-Instanz lokal sind.Using the statically linked CRT implies that any state information saved by the C runtime library will be local to that instance of the CRT. Wenn Sie bei einer statisch verknüpften CRT strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l verwenden, ist die Position des strtok-Parsers nicht mit dem strtok-Zustand verbunden, der im Code des gleichen Prozesses (jedoch in einer anderen DLL oder EXE) verwendet wird, welcher mit einer anderen Instanz der statischen CRT verknüpft ist.For example, if you use strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l when using a statically linked CRT, the position of the strtok parser is unrelated to the strtok state used in code in the same process (but in a different DLL or EXE) that is linked to another instance of the static CRT. 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.In contrast, the dynamically linked CRT shares state for all code within a process that is dynamically linked to the CRT. Bei den neuen sichereren Versionen dieser Funktionen wie strtok_s tritt dieses Problem nicht auf.This concern does not apply if you use the new more secure versions of these functions; for example, strtok_s does not have this problem.

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.Because a DLL built by linking to a static CRT will have its own CRT state, it is not recommended to link statically to the CRT in a DLL unless the consequences of this are specifically desired and understood. 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.For example, if you call _set_se_translator in an executable that loads the DLL linked to its own static CRT, any hardware exceptions generated by the code in the DLL will not be caught by the translator, but hardware exceptions generated by code in the main executable will be caught.

Wenn Sie den /clr -Compilerschalter verwenden, wird der Code mit der statischen Bibliothek msvcmrt.lib verknüpft.If you are using the /clr compiler switch, your code will be linked with a static library, msvcmrt.lib. Die statische Bibliothek stellt einen Proxy zwischen dem verwalteten Code und der systemeigenen CRT bereit.The static library provides a proxy between your managed code and the native CRT. Die statisch verknüpfte CRT (Option /MT oder Option /MTd ) können Sie nicht mit /clrverwenden.You cannot use the statically linked CRT ( /MT or /MTd options) with /clr. Verwenden Sie stattdessen die dynamisch verknüpften Bibliotheken (/MD oder /MDd).Use the dynamically-linked libraries (/MD or /MDd) instead. Die reinen verwalteten CRT-Bibliotheken sind in Visual Studio 2015 als veraltet markiert und werden in Visual Studio 2017 nicht unterstützt.The pure managed CRT libraries are deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017.

Weitere Informationen zur Verwendung der CRT mit /clr finden Sie unter Gemischte (native und verwaltete) Assemblys.For more information on using the CRT with /clr, see Mixed (Native and Managed) Assemblies.

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.To build a debug version of your application, the _DEBUG flag must be defined and the application must be linked with a debug version of one of these libraries. Weitere Informationen zur Verwendung der Debugversionen der Bibliotheksdateien finden Sie unter CRT-Debugverfahren.For more information about using the debug versions of the library files, see CRT Debugging Techniques.

Diese Version der CRT ist nicht vollständig mit dem Standard C99 konform.This version of the CRT is not fully conformant with the C99 standard. Insbesondere der <tgmath.h>-Header und die CX_LIMITED_RANGE/FP_CONTRACT-Pragmamakros werden nicht unterstützt.In particular, the <tgmath.h> header and the CX_LIMITED_RANGE/FP_CONTRACT pragma macros are not supported. Für bestimmte Elemente, etwa die Bedeutung von Parameterbezeichnern in Standard-E/A-Funktionen, werden standardmäßig frühere Interpretationen verwendet.Certain elements such as the meaning of parameter specifiers in standard IO functions use legacy interpretations by default. Sie können die /Zc-Compileroptionen für Konformität verwenden und Linkeroptionen angeben, um einige Aspekte der Bibliothekskonformität zu steuern.You can use /Zc compiler conformance options and specify linker options to control some aspects of library conformance,

C++-StandardbibliothekC++ Standard Library

C++-StandardbibliothekC++ Standard Library EigenschaftenCharacteristics OptionOption PräprozessordirektivenPreprocessor directives
libcpmt.liblibcpmt.lib Multithreaded, statischer LinkMultithreaded, static link /MT/MT _MT_MT
msvcprt.libmsvcprt.lib Multithreaded, dynamischer Link (Importbibliothek für MSVCPversion.dll)Multithreaded, dynamic link (import library for MSVCPversion.dll) /MD/MD _MT, _DLL_MT, _DLL
libcpmtd.liblibcpmtd.lib Multithreaded, statischer LinkMultithreaded, static link /MTd/MTd _DEBUG, _MT_DEBUG, _MT
msvcprtd.libmsvcprtd.lib Multithreaded, dynamischer Link (Importbibliothek für MSVCPversionD.DLL)Multithreaded, dynamic link (import library for MSVCPversionD.DLL) /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

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.When you build a release version of your project, one of the basic C run-time libraries (libcmt.lib, msvcmrt.lib, msvcrt.lib) is linked by default, depending on the compiler option you choose (multithreaded, DLL, /clr). Wenn Sie eine der Headerdateien der C++-Standardbibliothek in den Code einfügen, wird von Visual C++ eine C++-Standardbibliothek automatisch zur Kompilierzeit eingebunden.If you include one of the C++ Standard Library header files in your code, a C++ Standard Library will be linked in automatically by Visual C++ at compile time. Beispiel:For example:

#include <ios>

Für die binäre Kompatibilität kann mehr als eine DLL-Datei von einer einzelnen Importbibliothek angegeben werden.For binary compatibility, more than one DLL file may be specified by a single import library. Versionsupdates führen womöglich dot-Bibliotheken ein, separate DLLs, die neue Bibliotheksfunktionen enthalten.Version updates may introduce dot libraries, separate DLLs that introduce new library functionality. Beispielsweise wurde durch Visual Studio 2017 15.6 „msvcp140_1.dll“ eingeführt, um zusätzliche Standardbibliotheksfunktionen zu unterstützen, ohne die von „msvcp140.dll“ unterstützte ABI zu unterbrechen.For example, Visual Studio 2017 version 15.6 introduced msvcp140_1.dll to support additional standard library functionality without breaking the ABI supported by msvcp140.dll. Die „msvcprt.lib“-Importbibliothek, die im Toolset für Visual Studio 2017 Version 15.6 enthalten ist, unterstützt beide DLLs, und die Komponente vcredist installiert für diese Version beide DLLs.The msvcprt.lib import library included in the toolset for Visual Studio 2017 version 15.6 supports both DLLs, and the vcredist for this version installs both DLLs. Sobald eine dot-Bibliothek geliefert wird, verfügt sie über eine feste ABI und wird nie über eine Abhängigkeit auf einer späteren dot-Bibliothek verfügen.Once shipped, a dot library has a fixed ABI, and will never have a dependency on a later dot library.

Welche Probleme gibt es, wenn in einer Anwendung mehrere CRT-Version verwendet werden?What problems exist if an application uses more than one CRT version?

Jedes ausführbare Image (EXE oder DLL) kann mit einer eigenen statisch verknüpften CRT versehen sein oder dynamisch mit einer CRT verknüpft werden.Every executable image (EXE or DLL) can have its own statically linked CRT, or can dynamically link to a CRT. Ob die Version der CRT statisch enthalten ist oder dynamisch von einem bestimmten Image geladen wird, hängt von der Version der Tools und Bibliotheken ab, mit denen es erstellt wurde.The version of the CRT statically included in or dynamically loaded by a particular image depends on the version of the tools and libraries it was built with. In einem einzelnen Prozess können mehrere EXE- und DLL-Images geladen werden, die jeweils mit einer eigenen CRT ausgestattet sind.A single process may load multiple EXE and DLL images, each with its own CRT. Jede dieser CRTs kann unterschiedliche Zuweisungen, interne Strukturlayouts und Speicherverhältnisse aufweisen.Each of those CRTs may use a different allocator, may have different internal structure layouts, and may use different storage arrangements. Dies bedeutet, dass der belegte Arbeitsspeicher, CRT-Ressourcen oder Klassen, die über eine DLL-Grenze übergeben werden, Probleme bei der Verwaltung des Arbeitsspeichers, der internen statischen Verwendung oder der Layoutinterpretation verursachen kann bzw. können.This means that allocated memory, CRT resources, or classes passed across a DLL boundary can cause problems in memory management, internal static usage, or layout interpretation. Welcher CRT-Deallokator wird beispielsweise verwendet, wenn eine Klasse in einer DLL zugewiesen ist, jedoch an eine andere DLL übergeben und von dieser gelöscht wird?For example, if a class is allocated in one DLL but passed to and deleted by another, which CRT deallocator is used? Die verursachten Fehler können von geringfügigen bis hin zu unmittelbar schwerwiegenden Fehlern reichen, weshalb von einer direkten Übertragung solcher Ressourcen strengstens abgeraten wird.The errors caused can range from the subtle to the immediately fatal, and therefore direct transfer of such resources is strongly discouraged.

Eine Vielzahl dieser Probleme kann vermieden werden, wenn Sie stattdessen ABI-Technologien (Application Binary Interface) verwenden, da diese als stabil und versionierbar gelten.You can avoid many of these issues by using Application Binary Interface (ABI) technologies instead, as they are designed to be stable and versionable. Entwerfen Sie Ihre DLL-Exportschnittstellen so, dass Informationen nach Wert übergeben werden oder der Arbeitsspeicher optimiert wird, der von der aufrufenden Funktion übergeben und nicht lokal zugewiesen und an den Aufrufer zurückgegeben wird.Design your DLL export interfaces to pass information by value, or to work on memory that is passed in by the caller rather than allocated locally and returned to the caller. Verwenden Sie die Marshallingmethoden, um strukturierte Daten zwischen ausführbaren Images zu kopieren.Use marshalling techniques to copy structured data between executable images. Kapseln Sie Ressourcen lokal, und lassen Sie nur die Bearbeitung über Handles oder Funktionen zu, die Sie Clients verfügbar machen.Encapsulate resources locally and only allow manipulation through handles or functions you expose to clients.

Einige dieser Probleme können auch vermieden werden, wenn alle Images in Ihrem Prozess die gleiche dynamisch geladene CRT-Version verwenden.It's also possible to avoid some of these issues if all of the images in your process use the same dynamically loaded version of the CRT. Um sicherzustellen, dass alle Komponenten dieselbe DLL-Version der CRT verwenden, erstellen sie diese mithilfe der /MD-Option, und verwenden Sie die gleichen Compilertoolset- und Eigenschaftseinstellungen.To ensure that all components use the same DLL version of the CRT, build them by using the /MD option, and use the same compiler toolset and property settings.

Beim Übergeben bestimmter CRT-Ressourcen (z.B. Dateihandles, Gebietsschemas und Umgebungsvariablen) über DLL-Grenzen hinweg muss sorgfältig vorgegangen werden, selbst wenn das Programm dieselbe CRT-Version verwendet.Some care is needed if your program passes certain CRT resources (such as file handles, locales and environment variables) across DLL boundaries, even when using the same version of the CRT. Weitere Informationen zu diesen Problemen und den jeweiligen Lösungsmöglichkeiten finden Sie unter Potenzielle Fehler bei der Übergabe von CRT-Objekten über DLL-Grenzen.For more information on the issues involved and how to resolve them, see Potential Errors Passing CRT Objects Across DLL Boundaries.

Siehe auchSee also