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.dll
verschoben, 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.lib
und 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 /clr
verwenden. 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 /clr
finden 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.dll
unterstü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