Fichiers de bibliothèque standard C (CRT) et C++ (STL) .lib
Cet article répertorie les fichiers de bibliothèque .lib
de runtime Microsoft C auxquels vous pouvez établir un lien lorsque vous développez votre application, ainsi que leurs options de compilateur et directives de préprocesseur associées.
Consultez Redistribuer des fichiers Visual C++ si vous recherchez des informations sur le déploiement des fichiers runtime C nécessaires pour prendre en charge votre application.
Consultez la référence de la bibliothèque runtime C si vous recherchez des informations de référence sur l’API pour la bibliothèque runtime C.
Remarque
L’implémentation de Microsoft de la bibliothèque standard C++ est souvent appelée bibliothèque de modèles STL ou Standard. Bien que la bibliothèque standard C++ soit le nom officiel de la bibliothèque tel que défini dans ISO 14882, en raison de l’utilisation populaire de « STL » et de « Bibliothèque de modèles standard » dans les moteurs de recherche, nous utilisons parfois ces noms pour faciliter la recherche de notre documentation.
Du point de vue historique, « STL » a initialement fait référence à la bibliothèque de modèles standard écrite par Alexander Stepanov. Certaines parties de cette bibliothèque ont été normalisées dans la bibliothèque standard C++. La bibliothèque standard intègre également la bibliothèque runtime ISO C, les parties de la bibliothèque Boost et d’autres fonctionnalités. Parfois, « STL » est utilisé pour faire référence aux conteneurs et aux algorithmes de la bibliothèque standard C++ adaptée à partir du STL de Stepanov. Dans cette documentation, la bibliothèque de modèles standard (STL) fait référence à la bibliothèque standard C++ dans son ensemble.
Fichiers runtime .lib
C
La bibliothèque standard ISO C fait partie de la bibliothèque standard C++. Les bibliothèques Visual C++ qui implémentent le CRT prennent en charge le développement du code natif ainsi que le code natif et managé mixte. Toutes les versions du CRT prennent en charge le développement multithread. La plupart des bibliothèques prennent en charge la liaison statique, pour lier la bibliothèque directement à votre code, ou la liaison dynamique pour permettre à votre code d’utiliser les fichiers DLL communs.
Dans Visual Studio 2015, le CRT a été refactorisé en nouveaux fichiers binaires. La bibliothèque Universal CRT (UCRT) contient les fonctions et variables globales exportées par la bibliothèque CRT C99 standard. L’UCRT est désormais un composant Windows et est fourni dans le cadre de Windows 10 et versions ultérieures. La bibliothèque statique, la bibliothèque d’importation DLL et les fichiers d’en-tête pour l’UCRT se trouvent désormais dans le Kit de développement logiciel (SDK) Windows. Lorsque vous installez Visual C++, le programme d’installation de Visual Studio installe le sous-ensemble du Kit de développement logiciel (SDK) Windows requis pour utiliser l’UCRT. Vous pouvez utiliser l’UCRT sur n’importe quelle version de Windows prise en charge par Visual Studio 2015 et ultérieur. Vous pouvez la redistribuer à l’aide de vcredist pour les versions prises en charge de Windows autres que Windows 10 ou version ultérieure. Pour plus d’informations, consultez Redistribution des fichiers Visual C++.
Le tableau suivant répertorie les bibliothèques qui implémentent l’UCRT.
Bibliothèque | DLL associée | Caractéristiques | Option | Directives de préprocesseur |
---|---|---|---|---|
libucrt.lib |
Aucun(e) | Lie de manière statique l’UCRT à votre code. | /MT |
_MT |
libucrtd.lib |
Aucun(e) | Version Debug de l’UCRT pour la liaison statique. Non redistribuable. | /MTd |
_DEBUG , _MT |
ucrt.lib |
ucrtbase.dll |
Bibliothèque d’importation de DLL pour l’UCRT. | /MD |
_MT , _DLL |
ucrtd.lib |
ucrtbased.dll |
Bibliothèque d’importation de DLL pour la version Debug de l’UCRT. Non redistribuable. | /MDd |
_DEBUG , , _MT _DLL |
La bibliothèque vcruntime contient du code spécifique à l’implémentation CRT Visual C++ : gestion des exceptions et prise en charge du débogage, vérifications du runtime et informations de type, détails de l’implémentation et certaines fonctions de bibliothèque étendues. La version de la bibliothèque vcruntime doit correspondre à la version du compilateur que vous utilisez.
Ce tableau répertorie les bibliothèques qui implémentent la bibliothèque vcruntime.
Bibliothèque | DLL associée | Caractéristiques | Option | Directives de préprocesseur |
---|---|---|---|---|
libvcruntime.lib |
Aucun(e) | Liée de manière statique à votre code. | /MT |
_MT |
libvcruntimed.lib |
Aucun(e) | Version Debug pour la liaison statique. Non redistribuable. | /MTd |
_MT , _DEBUG |
vcruntime.lib |
vcruntime<version>.dll |
Bibliothèque d’importation de DLL pour vcruntime. | /MD |
_MT , _DLL |
vcruntimed.lib |
vcruntime<version>d.dll |
Bibliothèque d’importation de DLL pour le vcruntime de débogage. Non redistribuable. | /MDd |
_DEBUG , , _MT _DLL |
Remarque
Lorsque l’UCRT a été refactorisé, les fonctions runtime d’accès concurrentiel ont été déplacées vers concrt140.dll
, qui a été ajoutée au package redistribuable C++. Cette DLL est obligatoire pour les conteneurs et algorithmes parallèles C++ tels que concurrency::parallel_for
. En outre, la bibliothèque standard C++ nécessite cette DLL sur Windows XP pour prendre en charge les primitives de synchronisation, car Windows XP n’a pas de variables de condition.
Le code qui initialise le CRT se trouve dans l’une des nombreuses bibliothèques, selon que la bibliothèque CRT est liée de manière statique ou dynamique, ou que le code est natif, managé ou mixte. Ce code gère le démarrage du CRT, l’initialisation interne des données par thread, et l’arrêt. Elle est spécifique à la version du compilateur utilisée. Cette bibliothèque est toujours liée de manière statique, même quand vous utilisez un UCRT lié de manière dynamique.
Ce tableau répertorie les bibliothèques qui implémentent l’initialisation et l’arrêt du CRT.
Bibliothèque | Caractéristiques | Option | Directives de préprocesseur |
---|---|---|---|
libcmt.lib |
Lie de manière statique le démarrage du CRT natif à votre code. | /MT |
_MT |
libcmtd.lib |
Lie de manière statique la version Debug du démarrage du CRT natif. Non redistribuable. | /MTd |
_DEBUG , _MT |
msvcrt.lib |
Bibliothèque statique pour le démarrage du CRT natif à utiliser avec les DLL UCRT et vcruntime. | /MD |
_MT , _DLL |
msvcrtd.lib |
Bibliothèque statique pour la version Debug du démarrage du CRT natif à utiliser avec les DLL UCRT et vcruntime. Non redistribuable. | /MDd |
_DEBUG , , _MT _DLL |
msvcmrt.lib |
Bibliothèque statique pour le démarrage du CRT natif et managé mixte à utiliser avec les DLL UCRT et vcruntime. | /clr |
|
msvcmrtd.lib |
Bibliothèque statique pour la version Debug du démarrage du CRT natif et managé mixte à utiliser avec les DLL UCRT et vcruntime. Non redistribuable. | /clr |
|
msvcurt.lib |
Déprécié Bibliothèque statique pour le CRT managé pur. | /clr:pure |
|
msvcurtd.lib |
Déprécié Bibliothèque statique pour la version Debug du CRT managé pur. Non redistribuable. | /clr:pure |
Si vous liez votre programme à partir de la ligne de commande sans option de compilateur qui spécifie une bibliothèque runtime C, l’éditeur de liens utilisera les bibliothèques CRT liées statiquement : libcmt.lib
, libvcruntime.lib
et libucrt.lib
.
L'utilisation du CRT lié de manière statique implique que les informations d'état enregistrées par la bibliothèque runtime C sont locales pour cette instance du CRT. Par exemple, si vous utilisez strtok
un CRT lié statiquement, la position de l’analyseur strtok
n’est pas liée à l’état utilisé dans le strtok
code dans le même processus (mais dans une DLL ou EXE différente) liée à une autre instance du CRT statique. En revanche, le CRT lié dynamiquement partage l'état pour tout le code dans un processus qui est lié dynamiquement au CRT. Cette préoccupation ne s’applique pas si vous utilisez les nouvelles versions plus sécurisées de ces fonctions ; par exemple, strtok_s
n’a pas ce problème.
Étant donné qu’une DLL créée en liant à un CRT statique a son propre état CRT, nous vous déconseillons de lier statiquement au CRT dans une DLL, sauf si les conséquences sont comprises et souhaitées. Par exemple, si vous appelez _set_se_translator
un exécutable qui charge la DLL liée à son propre CRT statique, toutes les exceptions matérielles générées par le code dans la DLL ne seront pas interceptées par le traducteur, mais les exceptions matérielles générées par le code dans l’exécutable principal seront interceptées.
Si vous utilisez le commutateur du /clr
compilateur, votre code est lié à une bibliothèque statique. msvcmrt.lib
La bibliothèque statique fournit un proxy entre votre code géré et la bibliothèque CRT native. Vous ne pouvez pas utiliser le CRT lié statiquement ( /MT
ou /MTd
les options) avec /clr
. Utilisez les bibliothèques liées dynamiquement (/MD
ou /MDd
) à la place. Les bibliothèques CRT managées pures sont déconseillées dans Visual Studio 2015 et non prises en charge dans Visual Studio 2017.
Pour plus d’informations sur l’utilisation du CRT avec /clr
, consultez Assemblys mixtes (natifs et managés).
Pour générer une version de débogage de votre application, l’indicateur _DEBUG
doit être défini et l’application doit être liée à une version de débogage de l’une de ces bibliothèques. Pour plus d’informations sur l’utilisation des versions de débogage des fichiers de bibliothèque, consultez les techniques de débogage CRT.
Cette version du CRT n’est pas entièrement conforme à la norme C99. Dans les versions antérieures à Visual Studio 2019 version 16.8, l’en-tête <tgmath.h>
n’est pas pris en charge. Dans toutes les versions, les CX_LIMITED_RANGE
macros pragma et FP_CONTRACT
pragma ne sont pas prises en charge. Certains éléments tels que la signification des spécificateurs de paramètres dans les fonctions d’E/S standard utilisent des interprétations héritées par défaut. Vous pouvez utiliser les /Zc
options de conformité du compilateur et spécifier des options d’éditeur de liens pour contrôler certains aspects de la conformité de la bibliothèque.
Fichiers de bibliothèque standard C++ (STL) .lib
Bibliothèque C++ Standard | Caractéristiques | Option | Directives de préprocesseur |
---|---|---|---|
libcpmt.lib |
Multithread, liaison statique | /MT |
_MT |
msvcprt.lib |
Lien dynamique multithread (bibliothèque d’importation pour msvcp<version>.dll ) |
/MD |
_MT , _DLL |
libcpmtd.lib |
Multithread, liaison statique | /MTd |
_DEBUG , _MT |
msvcprtd.lib |
Lien dynamique multithread (bibliothèque d’importation pour msvcp<version>d.dll ) |
/MDd |
_DEBUG , , _MT _DLL |
Lorsque vous générez une version de version de votre projet, l’une des bibliothèques de runtime C de base (libcmt.lib
, , msvcmrt.lib
msvcrt.lib
) est liée par défaut, selon l’option du compilateur que vous choisissez (multithreaded, DLL, /clr
). Si vous incluez l’un des fichiers d’en-tête de la bibliothèque standard C++ dans votre code, une bibliothèque standard C++ est liée automatiquement par Visual C++ au moment de la compilation. Par exemple :
#include <ios>
Pour la compatibilité binaire, plusieurs fichiers DLL peuvent être spécifiés par une seule bibliothèque d’importation. Les mises à jour de version peuvent introduire des bibliothèques dot, des DLL séparées qui introduisent de nouvelles fonctionnalités de bibliothèque. Par exemple, Visual Studio 2017 version 15.6 a introduit pour prendre en msvcp140_1.dll
charge davantage de fonctionnalités de bibliothèque standard sans rompre l’interface binaire d’application (ABI) prise en charge par msvcp140.dll
. La msvcprt.lib
bibliothèque d’importation incluse dans l’ensemble d’outils pour Visual Studio 2017 version 15.6 prend en charge les dll et le vcredist pour cette version installe les deux DLL. Une fois livrée, une bibliothèque dot a une ABI fixe et n’aura jamais de dépendance avec une bibliothèque dot ultérieure.
Quels sont les problèmes qui peuvent se poser si une application utilise plusieurs versions du CRT ?
Chaque image exécutable (EXE ou DLL) peut avoir son propre CRT lié statiquement, ou peut être liée de manière dynamique à un CRT. La version du CRT statique incluse ou chargée dynamiquement par une image particulière dépend de la version des outils et des bibliothèques avec lesquels elle a été créée. Un même processus peut charger plusieurs images EXE et DLL, chacune avec son propre CRT. Chacun de ces CRT peut utiliser un allocateur différent, avoir des dispositions de structure interne différentes, et utiliser des dispositions de stockage différentes. Cela signifie que la mémoire allouée, les ressources CRT ou les classes passées à travers une limite DLL peuvent entraîner des problèmes de gestion de la mémoire, d’utilisation statique interne ou d’interprétation de disposition. Par exemple, si une classe est allouée dans une DLL, mais passée puis supprimée par une autre, quel est l’annulateur d’allocation CRT utilisé ? Les erreurs provoquées peuvent aller du subtil au immédiatement irrécupérable, et par conséquent le transfert direct de ces ressources est déconseillé.
Vous pouvez éviter un grand nombre de ces problèmes à l’aide des technologies ABI (Application Binary Interface) à la place, car elles sont conçues pour être stables et versionsables. Concevez vos interfaces d’exportation DLL pour passer les informations par valeur ou pour utiliser une mémoire passée par l’appelant plutôt qu’allouée localement puis retournée à l’appelant. Utilisez des techniques de marshaling pour copier des données structurées entre des images exécutables. Encapsulez les ressources localement et autorisez uniquement la manipulation au moyen de handles ou de fonctions que vous exposez aux clients.
Il est également possible d’éviter certains de ces problèmes si toutes les images de votre processus utilisent la même version chargée dynamiquement du CRT. Pour vous assurer que tous les composants utilisent la même version DLL du CRT, générez-les à l’aide de l’option /MD
et utilisez le même ensemble d’outils de compilateur et les mêmes paramètres de propriété.
Veillez à ce que votre programme passe certaines ressources CRT au-delà des limites de DLL. Les ressources telles que les handles de fichiers, les paramètres régionaux et les variables d’environnement peuvent entraîner des problèmes, même lors de l’utilisation de la même version du CRT. Pour plus d’informations sur les problèmes impliqués et sur la façon de les résoudre, consultez Erreurs potentielles en passant des objets CRT à travers les limites de DLL.
Voir aussi
Informations de référence sur la bibliothèque Runtime C
Redistribution des fichiers Visual C++