C-Runtime-Dateien (CRT) und C++-Standardbibliotheksdateien (STL) .lib

In diesem Artikel werden die Microsoft C-Laufzeitbibliotheksdateien .lib aufgeführt, mit denen Sie beim Entwickeln Ihrer Anwendung eine Verknüpfung herstellen können, sowie die zugehörigen Compileroptionen und Präprozessordirektiven.

Informationen zum Bereitstellen der C-Runtime-Dateien, die für die Unterstützung Ihrer Anwendung erforderlich sind, finden Sie unter Redistributing visual C++-Dateien .

Siehe C-Laufzeitbibliotheksreferenz, wenn Sie nach API-Referenz für die C-Laufzeitbibliothek suchen.

Hinweis

Microsofts Implementierung der C++-Standardbibliothek wird häufig als STL - oder Standardvorlagenbibliothek bezeichnet. Obwohl die C++-Standardbibliothek der offizielle Name der Bibliothek gemäß ISO 14882 ist, verwenden wir aufgrund der beliebten Verwendung von "STL" und "Standard Template Library" in Suchmaschinen gelegentlich diese Namen, um die Suche nach unserer Dokumentation zu erleichtern.

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

C-Laufzeitdateien .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 das 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. Die UCRT ist jetzt eine Windows-Komponente und wird als Teil von Windows 10 und höheren Versionen ausgeliefert. Die statische Bibliothek, DLL-Importbibliothek und 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, das 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 sie 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: Ausnahmebehandlung und Debuggingunterstützung, 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 die UCRT umgestaltet wurde, wurden die Concurrency-Runtime-Funktionen in das verteilbare C++-Paket verschoben concrt140.dll. 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 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 , ist die Position des strtok Parsers nicht mit dem Zustand verknüpft, der strtok im Code im selben Prozess (aber in einer anderen DLL oder EXE) verwendet wird, die mit einer anderen Instanz des 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. Dieses Problem gilt nicht, wenn Sie die neuen sichereren Versionen dieser Funktionen verwenden. Dieses Problem hat z. B strtok_s . nicht.

Da eine DLL, die durch Verknüpfen mit einem statischen CRT erstellt wurde, über einen eigenen CRT-Zustand verfügt, empfehlen wir Ihnen nicht, statisch mit dem CRT in einer DLL zu verknüpfen, es sei denn, die Konsequenzen werden verstanden und gewünscht. Wenn Sie beispielsweise eine ausführbare Datei aufrufen _set_se_translator , die die DLL lädt, die mit ihrem eigenen statischen CRT verknüpft ist, werden alle hardwarebasierten Ausnahmen, die vom Code in der DLL generiert werden, nicht vom Übersetzer erfasst, aber Hardware-Ausnahmen, die von Code in der 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 das statisch verknüpfte CRT ( /MT oder /MTd die Optionen) nicht mit /clr. 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 des CRT mit /clr, finden Sie unter Gemischte Assemblys (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 werden. Weitere Informationen zur Verwendung der Debugversionen der Bibliotheksdateien finden Sie unter CRT-Debuggingtechniken.

Diese Version des CRT ist nicht vollständig konform mit dem C99-Standard. 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 makros und FP_CONTRACT pragma 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 (import library for msvcp<version>.dll) /MD _MT, _DLL
libcpmtd.lib Multithreaded, statischer Link /MTd _DEBUG, _MT
msvcprtd.lib Multithreaded, dynamic link (import library for msvcp<version>d.dll) /MDd _DEBUG, _MT_DLL

Wenn Sie eine Releaseversion Ihres Projekts erstellen, ist eine der grundlegenden C-Laufzeitbibliotheken (libcmt.lib, , ) msvcrt.libstandardmäßig verknüpft, abhängig von der von Ihnen ausgewählten Compileroption (Multithreaded, DLL, /clrmsvcmrt.lib). Wenn Sie eine der C++-Standardbibliotheksheaderdateien in Ihren Code einschließen, wird zur Kompilierungszeit automatisch eine C++-Standardbibliothek von Visual C++ verknüpft. Zum 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. Visual Studio 2017, Version 15.6, wurde beispielsweise eingeführt msvcp140_1.dll , um mehr Standardbibliotheksfunktionen zu unterstützen, ohne die von msvcp140.dllder Anwendung unterstützte Binärschnittstelle (Application Binary Interface, ABI) zu unterbrechen. Die msvcprt.lib importbibliothek, die im Toolset für Visual Studio 2017, Version 15.6 enthalten ist, unterstützt sowohl DLLs als auch 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 über eine DLL-Grenze übergebene Speicher, CRT-Ressourcen oder Klassen zu Problemen bei der Speicherverwaltung, der internen statischen Verwendung oder der Layoutinterpretation führen 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 der subtilen bis zur unmittelbar tödlichen reichen, und daher wird eine direkte Übertragung solcher Ressourcen abgeraten.

Sie können viele dieser Probleme vermeiden, indem Sie stattdessen ABI-Technologien (Application Binary Interface) verwenden, da sie so konzipiert sind, dass sie stabil und versionsfähig 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 Marshalling-Techniken, um strukturierte Daten zwischen ausführbaren Bildern 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 die gleichen Compilertoolset und Eigenschafteneinstellungen.

Achten Sie darauf, 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 beteiligten Problemen und deren Behebung finden Sie unter Potenzielle Fehler, die CRT-Objekte über DLL-Grenzen hinweg übergeben.

Siehe auch

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