C-Runtimedateien (CRT) und C++-Standardbibliotheksdateien (STL) .lib

In diesem Artikel werden die Dateien der Microsoft C-Laufzeitbibliothek .lib aufgeführt, mit denen Sie beim Entwickeln Ihrer Anwendung verknüpfen können, sowie die zugehörigen Compileroptionen und Präprozessordirektiven.

Informationen zum Bereitstellen der C-Runtimedateien, die zur Unterstützung Ihrer Anwendung erforderlich sind, finden Sie unter Verteilen von Visual C++-Dateien .

Wenn Sie nach einer API-Referenz für die C-Laufzeitbibliothek suchen, lesen Sie die Referenz zur C-Laufzeitbibliothek .

Hinweis

Die Implementierung der C++-Standardbibliothek von Microsoft wird häufig als STL oder Standardvorlagenbibliothek bezeichnet. Obwohl die C++-Standardbibliothek der offizielle Name der Bibliothek ist, wie in ISO 14882 definiert, verwenden wir aufgrund der häufigen Verwendung von "STL" und "Standardvorlagenbibliothek" in Suchmaschinen gelegentlich diese Namen, um das Auffinden unserer Dokumentation zu erleichtern.

Aus historischer Sicht bezog sich "STL" ursprünglich auf die Standardvorlagenbibliothek, die von Alexander Stepanov geschrieben wurde. Teile dieser Bibliothek wurden in der C++-Standardbibliothek standardisiert. Die Standardbibliothek enthält auch die ISO C-Runtimebibliothek, Teile der Boost-Bibliothek und andere Funktionen. Manchmal wird "STL" verwendet, um auf die Container und Algorithmen teile der C++-Standardbibliothek zu verweisen, die aus der STL von Stepanov angepasst wurden. In dieser Dokumentation bezieht sich die Standardvorlagenbibliothek (STL) auf die C++-Standardbibliothek als Ganzes.

C-Runtimedateien .lib

Die ISO C-Standardbibliothek ist Teil der C++-Standardbibliothek. Die Visual C++-Bibliotheken, die die CRT implementieren, unterstützen die Entwicklung von nativem Code und Mischungen aus nativem und verwaltetem Code. Alle Versionen der CRT unterstützen Multithreaded-Entwicklung. 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.

In Visual Studio 2015 wurde die CRT in neue Binärdateien umgestaltet. Die UCRT (Universal CRT) enthält die Funktionen und globalen Elemente, die durch die Standard-C99 CRT-Bibliothek exportiert werden. Der UCRT ist jetzt eine Windows-Komponente und wird als Teil von Windows 10 und höheren Versionen ausgeliefert. Die statische Bibliothek, die DLL-Importbibliothek und die Headerdateien für das UCRT befinden sich jetzt im Windows SDK. Wenn Sie Visual C++ installieren, installiert Visual Studio-Setup die Teilmenge des Windows SDK, die für die Verwendung des UCRT erforderlich ist. Sie können die UCRT unter jeder Version von Windows verwenden, die von Visual Studio 2015 und späteren Versionen unterstützt wird. Sie können es mithilfe von vcredist für unterstützte Versionen von Windows weiterverteilen, die nicht Windows 10 oder höher sind. Weitere Informationen finden Sie unter Verteilen von Visual C++-Dateien.

In der folgenden Tabelle sind die Bibliotheken aufgelistet, die die UCRT implementieren.

Bibliothek Zugehörige DLL Merkmale Option Präprozessordirektiven
libucrt.lib Keine Bindet die UCRT statisch in Ihren Code ein. /MT _MT
libucrtd.lib Keine Die Debugversion der UCRT für statisches Linken. Nicht neu verteilbar. /MTd _DEBUG, _MT
ucrt.lib ucrtbase.dll DLL-Importbibliothek für die UCRT. /MD _MT, _DLL
ucrtd.lib ucrtbased.dll DLL-Importbibliothek für die Debugversion der UCRT. Nicht neu verteilbar. /MDd _DEBUG, _MT, _DLL

Die vcruntime-Bibliothek enthält Visual C++-CRT-implementierungsspezifischen Code: Unterstützung für die Ausnahmebehandlung und -debugging, Laufzeitüberprüfungen und Typinformationen, Implementierungsdetails und bestimmte erweiterte Bibliotheksfunktionen. Die Vcruntime-Bibliotheksversion muss mit der Version des compilers übereinstimmen, den Sie verwenden.

In der folgenden Tabelle sind die Bibliotheken aufgelistet, die die vcruntime-Bibliothek implementieren.

Bibliothek Zugehörige DLL Merkmale Option Präprozessordirektiven
libvcruntime.lib Keine Wird statisch in Ihren Code eingebunden. /MT _MT
libvcruntimed.lib Keine Die Debugversion für statisches Linken. Nicht neu verteilbar. /MTd _MT, _DEBUG
vcruntime.lib vcruntime<version>.dll DLL-Importbibliothek für die vcruntime. /MD _MT, _DLL
vcruntimed.lib vcruntime<version>d.dll DLL-Importbibliothek für die Debug-vcruntime. Nicht neu verteilbar. /MDd _DEBUG, _MT, _DLL

Hinweis

Als der UCRT umgestaltet wurde, wurden die Concurrency Runtime-Funktionen in concrt140.dllverschoben, die dem C++-Redistributable-Paket hinzugefügt wurde. Diese DLL ist für parallele C++-Container und -Algorithmen wie concurrency::parallel_for erforderlich. Darüber hinaus erfordert die C++-Standardbibliothek diese DLL unter Windows XP, um Synchronisierungsgrundtypen zu unterstützen, da Windows XP keine Bedingungsvariablen aufweist.

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. Dieser Code verwaltet den CRT-Start, die interne threadbezogene Dateninitialisierung und die Beendigung. Es ist spezifisch für die Version des verwendeten Compilers. Diese Bibliothek wird immer statisch gebunden, auch wenn eine dynamisch gebundene UCRT verwendet wird.

In der folgenden Tabelle sind die Bibliotheken aufgelistet, die die CRT-Initialisierung und -Beendigung implementieren.

Bibliothek Merkmale Option Präprozessordirektiven
libcmt.lib Bindet den systemeigenen CRT-Startcode statisch in Ihren Code ein. /MT _MT
libcmtd.lib Bindet die Debugversion des systemeigenen CRT-Startcode statisch ein. Nicht neu verteilbar. /MTd _DEBUG, _MT
msvcrt.lib Statische Bibliothek für den systemeigenen CRT-Startcode zur Verwendung mit DLL UCRT und vcruntime. /MD _MT, _DLL
msvcrtd.lib Statische Bibliothek für die Debugversion des systemeigenen CRT-Startcodes zur Verwendung mit DLL UCRT und vcruntime. Nicht neu verteilbar. /MDd _DEBUG, _MT, _DLL
msvcmrt.lib Statische Bibliothek für den gemischten systemeigenen und verwalteten CRT-Startcode zur Verwendung mit DLL UCRT und vcruntime. /clr
msvcmrtd.lib Statische Bibliothek für die Debugversion des gemischten systemeigenen und verwalteten CRT-Startcodes zur Verwendung mit DLL UCRT und vcruntime. Nicht neu verteilbar. /clr
msvcurt.lib Veraltet Statische Bibliothek für die ausschließlich verwaltete CRT. /clr:pure
msvcurtd.lib Veraltet Statische Bibliothek für die Debugversion der ausschließlich verwalteten CRT. Nicht neu verteilbar. /clr:pure

Wenn Sie Ihr Programm über die Befehlszeile ohne eine Compileroption verknüpfen, die eine C-Laufzeitbibliothek angibt, verwendet der Linker die statisch verknüpften CRT-Bibliotheken: libcmt.lib, libvcruntime.libund 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. Wenn Sie z. B. eine statisch verknüpfte CRT verwenden strtok , hängt die Position des strtok Parsers nicht mit dem Zustand zusammen, der strtok im Code im selben Prozess (jedoch in einer anderen DLL oder 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. Diese Bedenken gelten nicht, wenn Sie die neuen sichereren Versionen dieser Funktionen verwenden. hat z. strtok_s B. dieses Problem nicht.

Da eine DLL, die durch Verknüpfen mit einer statischen CRT erstellt wird, über einen eigenen CRT-Zustand verfügt, wird davon abgeraten, statisch mit der CRT in einer DLL zu verknüpfen, es sei denn, die Konsequenzen sind verstanden und gewünscht. Wenn Sie beispielsweise in einer ausführbaren Datei aufrufen _set_se_translator , die die DLL lädt, die mit ihrer eigenen statischen CRT verknüpft ist, werden alle vom Code in der DLL generierten Hardwareausnahmen nicht vom Übersetzer abgefangen, aber Hardwareausnahmen, die vom Code in der ausführbaren Hauptdatei generiert werden, werden abgefangen.

Wenn Sie den /clr Compilerschalter verwenden, wird Ihr Code mit einer statischen Bibliothek verknüpft: msvcmrt.lib. Die statische Bibliothek stellt einen Proxy zwischen dem verwalteten Code und der systemeigenen CRT bereit. Sie können die statisch verknüpfte CRT ( /MT oder /MTd -Optionen) nicht mit /clrverwenden. Verwenden Sie stattdessen die dynamisch verknüpften Bibliotheken (/MD oder /MDd). Die reinen verwalteten CRT-Bibliotheken sind in Visual Studio 2015 als veraltet markiert und werden in Visual Studio 2017 nicht unterstützt.

Weitere Informationen zur Verwendung der CRT mit /clrfinden Sie unter Gemischte (native und verwaltete) Assemblys.

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

Diese Version des CRT ist nicht vollständig mit dem C99-Standard konform. In Versionen vor Visual Studio 2019 Version 16.8 wird der <tgmath.h> Header nicht unterstützt. In allen Versionen werden die CX_LIMITED_RANGE Pragma-Makros und FP_CONTRACT nicht unterstützt. Für bestimmte Elemente, etwa die Bedeutung von Parameterbezeichnern in Standard-E/A-Funktionen, werden standardmäßig frühere Interpretationen verwendet. Sie können Compilerkonformitätsoptionen verwenden /Zc und Linkeroptionen angeben, um einige Aspekte der Bibliothekskonformität zu steuern.

C++-Standardbibliotheksdateien (STL) .lib

C++-Standardbibliothek Merkmale Option Präprozessordirektiven
libcpmt.lib Multithreaded, statischer Link /MT _MT
msvcprt.lib Multithreaded, Dynamic Link (Importbibliothek für msvcp<version>.dll) /MD _MT, _DLL
libcpmtd.lib Multithreaded, statischer Link /MTd _DEBUG, _MT
msvcprtd.lib Multithreaded, Dynamic Link (Importbibliothek für msvcp<version>d.dll) /MDd _DEBUG, _MT, _DLL

Wenn Sie eine Releaseversion Ihres Projekts erstellen, ist eine der grundlegenden C-Runtimebibliotheken (libcmt.lib, msvcmrt.lib, msvcrt.lib) standardmäßig verknüpft, abhängig von der ausgewählten Compileroption (Multithread, DLL, /clr). Wenn Sie eine der C++-Standardbibliotheksheaderdateien in Ihren Code einschließen, wird eine C++-Standardbibliothek zur Kompilierzeit automatisch von Visual C++ verknüpft. Beispiel:

#include <ios>

Für die binäre Kompatibilität kann mehr als eine DLL-Datei von einer einzelnen Importbibliothek angegeben werden. Versionsupdates führen womöglich dot-Bibliotheken ein, separate DLLs, die neue Bibliotheksfunktionen enthalten. Beispielsweise wurde Visual Studio 2017 Version 15.6 eingeführt msvcp140_1.dll , um mehr Standardbibliotheksfunktionen zu unterstützen, ohne die von msvcp140.dllunterstützte Application Binary Interface (ABI) zu unterbrechen. Die msvcprt.lib im Toolset für Visual Studio 2017 Version 15.6 enthaltene Importbibliothek unterstützt beide DLLs, und der Vcredist für diese Version installiert beide 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.

Welche Probleme gibt es, wenn in einer Anwendung mehrere CRT-Version verwendet werden?

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. 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. In einem einzelnen Prozess können mehrere EXE- und DLL-Images geladen werden, die jeweils mit einer eigenen CRT ausgestattet sind. Jede dieser CRTs kann unterschiedliche Zuweisungen, interne Strukturlayouts und Speicherverhältnisse aufweisen. Dies bedeutet, dass zugeordneter Arbeitsspeicher, CRT-Ressourcen oder Klassen, die über eine DLL-Grenze übergeben werden, Probleme bei der Speicherverwaltung, der internen statischen Nutzung oder der Layoutinterpretation verursachen können. 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? Die verursachten Fehler können von subtilen bis zu sofort fatalen reichen, und daher wird von einer direkten Übertragung solcher Ressourcen abgeraten.

Sie können viele dieser Probleme vermeiden, indem Sie stattdessen ABI-Technologien (Application Binary Interface) verwenden, da sie stabil und versionierbar sind. 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. Verwenden Sie Marshalltechniken, um strukturierte Daten zwischen ausführbaren Images zu kopieren. Kapseln Sie Ressourcen lokal, und lassen Sie nur die Bearbeitung über Handles oder Funktionen zu, die Sie Clients verfügbar machen.

Einige dieser Probleme können auch vermieden werden, wenn alle Images in Ihrem Prozess die gleiche dynamisch geladene CRT-Version verwenden. Um sicherzustellen, dass alle Komponenten dieselbe DLL-Version des CRT verwenden, erstellen Sie sie mithilfe der /MD Option, und verwenden Sie dasselbe Compilertoolset und dieselben Eigenschafteneinstellungen.

Seien Sie vorsichtig, wenn Ihr Programm bestimmte CRT-Ressourcen über DLL-Grenzen hinweg übergibt. Ressourcen wie Dateihandles, Gebietsschemas und Umgebungsvariablen können Probleme verursachen, auch wenn dieselbe Version des CRT verwendet wird. Weitere Informationen zu den betroffenen Problemen und deren Behebung finden Sie unter Mögliche Fehler beim Übergeben von CRT-Objekten über DLL-Grenzen hinweg.

Weitere Informationen

Referenz zur C-Laufzeitbibliothek
Verteilen von Visual C++-Dateien