C-Laufzeitdateien (CRT) und C++ Standardbibliothek (STL) .lib

In diesem Thema sind die Microsoft C-Laufzeitbibliotheksdateien .lib aufgeführt, die Sie beim Entwickeln Ihrer Anwendung und deren zugeordneten Compileroptionen und Präprozessorrichtlinien verknüpfen können.

Weitere Informationen zum Bereitstellen der C-Runtime-Dateien finden Sie unter Redistributing von Visual C++-Dateien , wenn Sie nach Informationen zur Bereitstellung der C-Runtime-Dateien suchen, die für die Unterstützung Ihrer Anwendung erforderlich sind.

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

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, aufgrund der beliebten Verwendung von "STL" und "Standardvorlagenbibliothek" in Suchmaschinen verwenden wir gelegentlich diese Namen, um unsere Dokumentation einfacher zu finden.

Aus einer historischen Perspektive verweist "STL" ursprünglich auf die Standardvorlagenbibliothek, die von Alexander Stepanov geschrieben wurde. Teile dieser Bibliothek wurden in der C++-Standardbibliothek standardisiert, zusammen mit der ISO C-Laufzeitbibliothek, Teilen der Boost-Bibliothek und anderen Funktionen. Manchmal wird "STL" verwendet, um auf die Container und Algorithmenteile der C++-Standardbibliothek zu verweisen, die von Stepanov's STL angepasst wurden. In dieser Dokumentation bezieht sich die Standardvorlagenbibliothek (STL) auf die C++ Standardbibliothek als Ganzes.

C-Laufzeitdateien .lib

Die C-Laufzeitbibliothek (CRT) ist der Teil der C++-Standardbibliothek, die die ISO C-Standardbibliothek enthält. 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.

Ab 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. Die UCRT ist jetzt eine Windows-Komponente und wird als Teil von Windows 10 und späteren Versionen bereitgestellt. Die statische Bibliothek, DLL-Importbibliothek und Headerdateien für die UCRT finden Sie jetzt im Windows SDK. Wenn Sie Visual C++installieren, installiert Visual Studio-Setup die Teilmenge des Windows SDK, das zum Verwenden 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, die nicht Windows 10 oder höher, weiterverteilt werden. 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, beispielsweise Ausnahmebehandlungs- und Debugunterstützung, Laufzeitprü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 neu entwickelt wurde, wurden die Concurrency-Runtime-Funktionen verschoben concrt140.dll, die dem C++-Redistributable-Paket hinzugefügt wurden. 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 hat.

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 aus der Befehlszeile ohne 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 strtok z. B. bei Verwendung eines statisch verknüpften CRT verwenden, ist die Position des strtok Parsers nicht mit dem strtok in Code verwendeten Zustand im gleichen Prozess (aber in einer anderen DLL oder EXE) verknüpft, 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. Diese Sorge gilt nicht, wenn Sie die neuen sichereren Versionen dieser Funktionen verwenden; Beispielsweise strtok_s hat dieses Problem nicht.

Da eine DLL, die mit einer Verknüpfung mit einem statischen CRT erstellt wurde, über einen eigenen CRT-Zustand verfügt, wird es nicht empfohlen, den CRT in einer DLL zu verknüpfen, es sei denn, die Folgen dieser Daten werden gewünscht und verstanden. Wenn Sie beispielsweise eine ausführbare Datei aufrufen _set_se_translator , die die DLL lädt, die mit einem 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 erfasst.

Wenn Sie den Compilerschalter verwenden, wird Der /clr 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 Mixed (Native und Managed) Assemblys.

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

Diese Version des CRT ist nicht vollständig mit dem C99-Standard konform. In Versionen vor Visual Studio 2019 Version 16.8 wird die <tgmath.h> Kopfzeile nicht unterstützt. In allen Versionen werden die CX_LIMITED_RANGEFP_CONTRACT und pragma-Makros 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 Compilerkonformanzoptionen verwenden /Zc und Linkeroptionen angeben, um einige Aspekte der Bibliothekskonformität zu steuern.

C++ Standardbibliothek (STL)- .lib Dateien

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

Wenn Sie eine Version Ihres Projekts erstellen, wird standardmäßig eine der grundlegenden C-Laufzeitbibliotheken (, , ) abhängig von der von Ihnen ausgewählten Compileroption (libcmt.libMultithreaded, msvcmrt.libmsvcrt.libDLL, /clrDLL) verknüpft. Wenn Sie eine der C++-Standardbibliotheksheaderdateien in Ihren Code einschließen, wird eine C++-Standardbibliothek automatisch von Visual C++ zur Kompilierung 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 zusätzliche Standardbibliotheksfunktionen zu unterstützen, ohne die von der ABI unterstützte Anwendungs-Binärschnittstelle (Application Binary Interface, ABI) zu msvcp140.dllunterstützen. Die msvcprt.lib In der Toolset für Visual Studio 2017 Version 15.6 enthaltene Importbibliothek unterstützt sowohl DLLs als auch den 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 zugewiesene Speicher-, CRT-Ressourcen oder Klassen, die über eine DLL-Grenze übergeben wurden, Probleme bei der Speicherverwaltung, der internen statischen Verwendung 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 sich von der subtilen bis zur sofortigen tödlichen Und daher direkte Übertragung dieser Ressourcen entmutigen.

Sie können viele dieser Probleme vermeiden, indem Sie stattdessen Application Binary Interface (ABI)-Technologien verwenden, da sie so konzipiert sind, dass 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 Marshaling-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 Eigenschaftseinstellungen.

Achten Sie darauf, wenn Ihr Programm bestimmte CRT-Ressourcen über DLL-Grenzen überschreitet. Ressourcen wie Dateihandpunkte, Gebietsschemas und Umgebungsvariablen können Probleme verursachen, auch wenn sie dieselbe Version des CRT verwenden. Weitere Informationen zu diesen Problemen und den jeweiligen Lösungsmöglichkeiten finden Sie unter Potential Errors Passing CRT Objects Across DLL Boundaries.

Weitere Informationen

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