Fonctionnalités de la bibliothèque CRTCRT Library Features

Cette rubrique décrit les différents fichiers .lib qui composent les bibliothèques Runtime C, ainsi que les options de compilateur et les directives de préprocesseur qui y sont associées.This topic discusses the various .lib files that comprise the C run-time libraries as well as their associated compiler options and preprocessor directives.

Bibliothèques runtime C (CRT)C Run-Time Libraries (CRT)

La bibliothèque runtime C (CRT) est la partie de la bibliothèque C++ standard qui incorpore la bibliothèque ISO C99 standard.The C Run-time Library (CRT) is the part of the C++ Standard Library that incorporates the ISO C99 standard library. 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.The Visual C++ libraries that implement the CRT support native code development, and both mixed native and managed code. Toutes les versions du CRT prennent en charge le développement multithread.All versions of the CRT support multi-threaded development. 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.Most of the libraries support both static linking, to link the library directly into your code, or dynamic linking to let your code use common DLL files.

À compter de Visual Studio 2015, le CRT est refactorisé dans de nouveaux binaires.Starting in Visual Studio 2015, the CRT has been refactored into new binaries. La bibliothèque Universal CRT (UCRT) contient les fonctions et variables globales exportées par la bibliothèque CRT C99 standard.The Universal CRT (UCRT) contains the functions and globals exported by the standard C99 CRT library. UCRT est désormais un composant Windows fourni avec Windows 10.The UCRT is now a Windows component, and ships as part of Windows 10. La bibliothèque statique, la bibliothèque d’importation de DLL et les fichiers d’en-tête UCRT se trouvent désormais dans le SDK Windows 10.The static library, DLL import library, and header files for the UCRT are now found in the Windows 10 SDK. Quand vous installez Visual C++, le programme d’installation de Visual Studio installe le sous-ensemble du SDK Windows 10 nécessaire à l’utilisation de l’UCRT.When you install Visual C++, Visual Studio setup installs the subset of the Windows 10 SDK required to use the UCRT. Vous pouvez utiliser l’UCRT sur n’importe quelle version de Windows prise en charge par Visual Studio 2015 et ultérieur.You can use the UCRT on any version of Windows supported by Visual Studio 2015 and later versions. Vous pouvez la redistribuer à l’aide de vcredist pour les versions prises en charge de Windows distinctes de Windows 10.You can redistribute it using vcredist for supported versions of Windows other than Windows 10. Pour plus d'informations, consultez Redistributing Visual C++ Files.For more information, see Redistributing Visual C++ Files.

Le tableau suivant répertorie les bibliothèques qui implémentent l’UCRT.The following table lists the libraries that implement the UCRT.

BibliothèqueLibrary DLL associéeAssociated DLL CaractéristiquesCharacteristics OptionOption Directives de préprocesseurPreprocessor directives
libucrt.liblibucrt.lib Aucun.None Lie de manière statique l’UCRT à votre code.Statically links the UCRT into your code. /MT/MT _MT_MT
libucrtd.liblibucrtd.lib Aucun.None Version Debug de l’UCRT pour la liaison statique.Debug version of the UCRT for static linking. Non redistribuable.Not redistributable. /MTd/MTd _DEBUG, _MT_DEBUG, _MT
ucrt.libucrt.lib ucrtbase.dllucrtbase.dll Bibliothèque d’importation de DLL pour l’UCRT.DLL import library for the UCRT. /MD/MD _MT, _DLL_MT, _DLL
ucrtd.libucrtd.lib ucrtbased.dllucrtbased.dll Bibliothèque d’importation de DLL pour la version Debug de l’UCRT.DLL import library for the Debug version of the UCRT. Non redistribuable.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

La bibliothèque vcruntime contient le code spécifique à l’implémentation du CRT Visual C++, par exemple la gestion des exceptions et la prise en charge du débogage, les vérifications à l’exécution et les informations de type, les détails d’implémentation, ainsi que certaines fonctions de bibliothèque étendues.The vcruntime library contains Visual C++ CRT implementation-specific code, such as exception handling and debugging support, runtime checks and type information, implementation details and certain extended library functions. Cette bibliothèque est spécifique à la version du compilateur utilisé.This library is specific to the version of the compiler used.

Ce tableau répertorie les bibliothèques qui implémentent la bibliothèque vcruntime.This table lists the libraries that implement the vcruntime library.

BibliothèqueLibrary DLL associéeAssociated DLL CaractéristiquesCharacteristics OptionOption Directives de préprocesseurPreprocessor directives
libvcruntime.liblibvcruntime.lib Aucun.None Liée de manière statique à votre code.Statically linked into your code. /MT/MT _MT_MT
libvcruntimed.liblibvcruntimed.lib Aucun.None Version Debug pour la liaison statique.Debug version for static linking. Non redistribuable.Not redistributable. /MTd/MTd _MT, _DEBUG_MT, _DEBUG
vcruntime.libvcruntime.lib vcruntime<version>.dllvcruntime<version>.dll Bibliothèque d’importation de DLL pour vcruntime.DLL import library for the vcruntime. /MD/MD _MT, _DLL_MT, _DLL
vcruntimed.libvcruntimed.lib vcruntime<version>d.dllvcruntime<version>d.dll Bibliothèque d’importation de DLL pour le vcruntime de débogage.DLL import library for the Debug vcruntime. Non redistribuable.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

Notes

Au moment de la refactorisation UCRT, les fonctions de runtime d’accès concurrentiel ont été déplacées vers concrt140.dll, qui a été ajouté au package redistribuable C++.When the UCRT refactoring occurred, the Concurrency Runtime functions were moved into concrt140.dll, which was added to the C++ redistributable package. Cette DLL est obligatoire pour les conteneurs et algorithmes parallèles C++ tels que concurrency::parallel_for.This DLL is required for C++ parallel containers and algorithms such as concurrency::parallel_for. De plus, la bibliothèque standard C++ nécessite cette DLL sur Windows XP pour permettre la prise en charge des primitives de synchronisation, car Windows XP n’a pas de variables de condition.In addition, the C++ Standard Library requires this DLL on Windows XP to support synchronization primitives, because Windows XP does not have condition variables.

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.The code that initializes the CRT is in one of several libraries, based on whether the CRT library is statically or dynamically linked, or native, managed, or mixed code. Ce code gère le démarrage du CRT, l’initialisation interne des données par thread, et l’arrêt.This code handles CRT startup, internal per-thread data initialization, and termination. Il est spécifique à la version du compilateur utilisé.It is specific to the version of the compiler used. Cette bibliothèque est toujours liée de manière statique, même quand vous utilisez un UCRT lié de manière dynamique.This library is always statically linked, even when using a dynamically linked UCRT.

Ce tableau répertorie les bibliothèques qui implémentent l’initialisation et l’arrêt du CRT.This table lists the libraries that implement CRT initialization and termination.

BibliothèqueLibrary CaractéristiquesCharacteristics OptionOption Directives de préprocesseurPreprocessor directives
LIBCMT.liblibcmt.lib Lie de manière statique le démarrage du CRT natif à votre code.Statically links the native CRT startup into your code. /MT/MT _MT_MT
libcmtd.liblibcmtd.lib Lie de manière statique la version Debug du démarrage du CRT natif.Statically links the Debug version of the native CRT startup. Non redistribuable.Not redistributable. /MTd/MTd _DEBUG, _MT_DEBUG, _MT
msvcrt.libmsvcrt.lib Bibliothèque statique pour le démarrage du CRT natif à utiliser avec les DLL UCRT et vcruntime.Static library for the native CRT startup for use with DLL UCRT and vcruntime. /MD/MD _MT, _DLL_MT, _DLL
msvcrtd.libmsvcrtd.lib Bibliothèque statique pour la version Debug du démarrage du CRT natif à utiliser avec les DLL UCRT et vcruntime.Static library for the Debug version of the native CRT startup for use with DLL UCRT and vcruntime. Non redistribuable.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL
msvcmrt.libmsvcmrt.lib Bibliothèque statique pour le démarrage du CRT natif et managé mixte à utiliser avec les DLL UCRT et vcruntime.Static library for the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. /clr/clr
msvcmrtd.libmsvcmrtd.lib Bibliothèque statique pour la version Debug du démarrage du CRT natif et managé mixte à utiliser avec les DLL UCRT et vcruntime.Static library for the Debug version of the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. Non redistribuable.Not redistributable. /clr/clr
msvcurt.libmsvcurt.lib Déprécié Bibliothèque statique pour le CRT managé pur.Deprecated Static library for the pure managed CRT. /clr:pure/clr:pure
msvcurtd.libmsvcurtd.lib Déprécié Bibliothèque statique pour la version Debug du CRT managé pur.Deprecated Static library for the Debug version of the pure managed CRT. Non redistribuable.Not redistributable. /clr:pure/clr:pure

Si vous liez votre programme à partir de la ligne de commande sans option de compilateur spécifiant une bibliothèque runtime C, l’éditeur de liens utilise les bibliothèques CRT liées de manière statique : libcmt.lib, libvcruntime.lib et libucrt.lib.If you link your program from the command line without a compiler option that specifies a C run-time library, the linker will use the statically linked CRT libraries: libcmt.lib, libvcruntime.lib, and 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.Using the statically linked CRT implies that any state information saved by the C runtime library will be local to that instance of the CRT. Par exemple, si vous utilisez strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l quand vous utilisez une bibliothèque CRT liée statiquement, la position de l’analyseur strtok n’est pas liée à l’état strtok utilisé dans le code du même processus (mais dans un autre fichier DLL ou EXE) qui est lié à une autre instance de la bibliothèque CRT statique.For example, if you use strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l when using a statically linked CRT, the position of the strtok parser is unrelated to the strtok state used in code in the same process (but in a different DLL or EXE) that is linked to another instance of the static CRT. En revanche, le CRT lié dynamiquement partage l'état pour tout le code dans un processus qui est lié dynamiquement au CRT.In contrast, the dynamically linked CRT shares state for all code within a process that is dynamically linked to the CRT. Cette restriction 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.This concern does not apply if you use the new more secure versions of these functions; for example, strtok_s does not have this problem.

Comme une DLL générée avec une liaison à une bibliothèque CRT statique aura son propre état CRT, il est déconseillé de se lier statiquement à la bibliothèque CRT dans une DLL, sauf si les conséquences de cette action sont spécifiquement souhaitées et comprises.Because a DLL built by linking to a static CRT will have its own CRT state, it is not recommended to link statically to the CRT in a DLL unless the consequences of this are specifically desired and understood. Par exemple, si vous appelez _set_se_translator dans un exécutable qui charge la DLL liée à sa propre bibliothèque CRT statique, les exceptions matérielles générées par le code de la DLL ne sont pas interceptées par le traducteur, tandis que les exceptions matérielles générées par le code du fichier exécutable principal le sont.For example, if you call _set_se_translator in an executable that loads the DLL linked to its own static CRT, any hardware exceptions generated by the code in the DLL will not be caught by the translator, but hardware exceptions generated by code in the main executable will be caught.

Si vous utilisez le commutateur /clr du compilateur, votre code sera lié à une bibliothèque statique, msvcmrt.lib.If you are using the /clr compiler switch, your code will be linked with a static library, msvcmrt.lib. La bibliothèque statique fournit un proxy entre votre code géré et la bibliothèque CRT native.The static library provides a proxy between your managed code and the native CRT. Vous ne pouvez pas utiliser la bibliothèque CRT liée statiquement (les options /MT ou /MTd ) avec /clr.You cannot use the statically linked CRT ( /MT or /MTd options) with /clr. Utilisez à la place les bibliothèques liées dynamiquement (/MD ou /MDd).Use the dynamically-linked libraries (/MD or /MDd) instead. Les bibliothèques CRT managées pures sont déconseillées dans Visual Studio 2015 et non prises en charge dans Visual Studio 2017.The pure managed CRT libraries are deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017.

Pour plus d’informations sur l’utilisation de CRT avec /clr, consultez Assemblys mixtes (natif et managé).For more information on using the CRT with /clr, see Mixed (Native and Managed) Assemblies.

Pour créer une version Debug de votre application, vous devez définir l’indicateur _DEBUG et lier l’application à une version Debug de l’une de ces bibliothèques.To build a debug version of your application, the _DEBUG flag must be defined and the application must be linked with a debug version of one of these libraries. Pour plus d'informations sur l'utilisation des versions Debug des fichiers de bibliothèques, consultez Techniques de débogage de la bibliothèque CRT.For more information about using the debug versions of the library files, see CRT Debugging Techniques.

Cette version du CRT n’est pas entièrement conforme à la norme C99.This version of the CRT is not fully conformant with the C99 standard. En particulier, l’en-tête <tgmath.h> et les macros de pragma CX_LIMITED_RANGE/FP_CONTRACT ne sont pas pris en charge.In particular, the <tgmath.h> header and the CX_LIMITED_RANGE/FP_CONTRACT pragma macros are not supported. 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.Certain elements such as the meaning of parameter specifiers in standard IO functions use legacy interpretations by default. Vous pouvez utiliser les options de conformité du compilateur /Zc, et spécifier les options de l’éditeur de liens pour contrôler certains aspects de la conformité de la bibliothèque,You can use /Zc compiler conformance options and specify linker options to control some aspects of library conformance,

Bibliothèque standard C++C++ Standard Library

Bibliothèque standard C++C++ Standard Library CaractéristiquesCharacteristics OptionOption Directives de préprocesseurPreprocessor directives
libcpmt.liblibcpmt.lib Multithread, liaison statiqueMultithreaded, static link /MT/MT _MT_MT
msvcprt.libmsvcprt.lib Multithread, liaison dynamique, (bibliothèque d’importation pour MSVCPversion.dll)Multithreaded, dynamic link (import library for MSVCPversion.dll) /MD/MD _MT, _DLL_MT, _DLL
libcpmtd.liblibcpmtd.lib Multithread, liaison statiqueMultithreaded, static link /MTd/MTd _DEBUG, _MT_DEBUG, _MT
msvcprtd.libmsvcprtd.lib Multithread, liaison dynamique, (bibliothèque d’importation pour MSVCPversionD.DLL)Multithreaded, dynamic link (import library for MSVCPversionD.DLL) /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

Quand vous générez une version de mise en production de votre projet, une des bibliothèques runtime C de base (libcmt.lib, msvcmrt.lib, msvcrt.lib) est liée par défaut, selon l’option de compilateur choisie (multithread, DLL, /clr).When you build a release version of your project, one of the basic C run-time libraries (libcmt.lib, msvcmrt.lib, msvcrt.lib) is linked by default, depending on the compiler option you choose (multithreaded, DLL, /clr). Si vous incluez un des fichiers d’en-tête de bibliothèque standard C++ dans votre code, une bibliothèque standard C++ est liée automatiquement par Visual C++ au moment de la compilation.If you include one of the C++ Standard Library header files in your code, a C++ Standard Library will be linked in automatically by Visual C++ at compile time. Par exemple :For example:

#include <ios>

Pour la compatibilité binaire, plusieurs fichiers DLL peuvent être spécifiés par une seule bibliothèque d’importation.For binary compatibility, more than one DLL file may be specified by a single import library. 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.Version updates may introduce dot libraries, separate DLLs that introduce new library functionality. Par exemple, Visual Studio 2017 version 15.6 a introduit msvcp140_1.dll pour prendre en charge une autre fonctionnalité de bibliothèque standard sans rompre l’ABI prise en charge par msvcp140.dll.For example, Visual Studio 2017 version 15.6 introduced msvcp140_1.dll to support additional standard library functionality without breaking the ABI supported by msvcp140.dll. La bibliothèque d’importation msvcprt.lib incluse dans l’ensemble d’outils de Visual Studio 2017 version 15.6 prend en charge les deux DLL, et le vcredist de cette version installe les deux DLL.The msvcprt.lib import library included in the toolset for Visual Studio 2017 version 15.6 supports both DLLs, and the vcredist for this version installs both DLLs. 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.Once shipped, a dot library has a fixed ABI, and will never have a dependency on a later dot library.

Quels sont les problèmes qui peuvent se poser si une application utilise plusieurs versions du CRT ?What problems exist if an application uses more than one CRT version?

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.Every executable image (EXE or DLL) can have its own statically linked CRT, or can dynamically link to a 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.The version of the CRT statically included in or dynamically loaded by a particular image depends on the version of the tools and libraries it was built with. Un même processus peut charger plusieurs images EXE et DLL, chacune avec son propre CRT.A single process may load multiple EXE and DLL images, each with its own 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.Each of those CRTs may use a different allocator, may have different internal structure layouts, and may use different storage arrangements. Cela signifie que la mémoire, les ressources CRT ou les classes allouées et passées dans une limite DLL peuvent entraîner des problèmes dans la gestion de la mémoire, dans l’utilisation statique interne ou dans interprétation de la disposition.This means that allocated memory, CRT resources, or classes passed across a DLL boundary can cause problems in memory management, internal static usage, or layout interpretation. 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é ?For example, if a class is allocated in one DLL but passed to and deleted by another, which CRT deallocator is used? Les erreurs causées peuvent aller d’un léger problème à une erreur fatale irrécupérable et, par conséquent, le transfert direct de ces ressources est fortement déconseillé.The errors caused can range from the subtle to the immediately fatal, and therefore direct transfer of such resources is strongly discouraged.

Vous pouvez éviter la plupart de ces problèmes en utilisant des technologies Application Binary Interface (ABI) car elles sont conçues pour être stables et versionnables.You can avoid many of these issues by using Application Binary Interface (ABI) technologies instead, as they are designed to be stable and versionable. 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.Design your DLL export interfaces to pass information by value, or to work on memory that is passed in by the caller rather than allocated locally and returned to the caller. Utilisez des techniques de marshaling pour copier des données structurées entre des images exécutables.Use marshalling techniques to copy structured data between executable images. Encapsulez les ressources localement et autorisez uniquement la manipulation au moyen de handles ou de fonctions que vous exposez aux clients.Encapsulate resources locally and only allow manipulation through handles or functions you expose to 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.It's also possible to avoid some of these issues if all of the images in your process use the same dynamically loaded version of the CRT. Pour vous assurer que tous les composants utilisent la même version DLL du CRT, créez-les à l’aide de l’option /MD et utilisez les mêmes outils de compilateur et paramètres de propriétés.To ensure that all components use the same DLL version of the CRT, build them by using the /MD option, and use the same compiler toolset and property settings.

Une attention particulière est nécessaire si votre programme passe certaines ressources CRT (comme les handles de fichiers, les paramètres régionaux et les variables d'environnement) à travers les limites des DLL, même en utilisant la même version du CRT.Some care is needed if your program passes certain CRT resources (such as file handles, locales and environment variables) across DLL boundaries, even when using the same version of the CRT. Pour plus d’informations sur les problèmes rencontrés et leur résolution, consultez Erreurs potentielles de passage d’objets CRT entre frontières DLL.For more information on the issues involved and how to resolve them, see Potential Errors Passing CRT Objects Across DLL Boundaries.

Voir aussiSee also