Partager via


Fonctions des bibliothèque CRT

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.

Bibliothèques Runtime C (CRT)

Les bibliothèques suivantes contiennent les fonctions de la bibliothèque Runtime C.

Bibliothèque Runtime C (sans la bibliothèque C++ iostream ou standard)

DLL associée

Caractéristiques

Option

Directives de préprocesseur

libcmt.lib

Aucune, liaison statique

Multithread, liaison statique

/MT

_MT

msvcrt.lib

msvcr120.dll

Multithread, liaison dynamique, (bibliothèque d'importation pour MSVCR120.DLL) Notez que si vous utilisez la bibliothèque C++ standard, votre programme a besoin de MSVCP120.DLL pour s'exécuter.

/MD

_MT, _DLL

libcmtd.lib

Aucune, liaison statique

Multithread, liaison statique (Debug)

/MTd

_DEBUG, _MT

msvcrtd.lib

msvcr120d.dll

Multithread, liaison dynamique, (bibliothèque d'importation pour MSVCR120D.DLL) (Debug)

/MDd

_DEBUG, _MT, _DLL

msvcmrt.lib

Aucune, liaison statique

Bibliothèque statique Runtime C++ Utilisé pour le code mixte managé/natif

/clr

 

msvcurt.lib

Aucune, liaison statique

Bibliothèque statique Runtime C compilée en code MSIL pur à 100 % Tout le code est conforme à la spécification ECMA URT pour MSIL.

/clr:pure

 

Notes

La bibliothèque CRT à thread unique (libc.lib, libcd.lib) (anciennement les options /ML ou /MLd) n'est plus disponible.À la place, utilisez la bibliothèque CRT multithread.Consultez Performances des bibliothèques multithread

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 LIBCMT.LIB. Ceci est différent des versions précédentes de Visual C++ qui utilisaient à la place LIBC.LIB, la bibliothèque à thread unique.

L'utilisation de la bibliothèque CRT liée statiquement implique que les informations d'état enregistrées par la bibliothèque Runtime C sont locales à cette instance de la bibliothèque 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. En revanche, la bibliothèque CRT liée dynamiquement partage l'état pour tout le code dans un processus qui est lié dynamiquement à la bibliothèque 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.

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. 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.

Si vous utilisez le commutateur /clr du compilateur, votre code sera 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 la bibliothèque CRT liée statiquement (les options /MT ou /MTd) avec /clr. Utilisez à la place les bibliothèques liées dynamiquement (/MD ou /MDd).

Si vous utilisez le commutateur /clr:pure du compilateur, votre code sera lié à la bibliothèque statique msvcurt.lib. Comme avec /clr, vous ne pouvez pas lier votre code avec la bibliothèque liée statiquement.

Pour plus d'informations sur l'utilisation de la bibliothèque CRT avec /clr, consultez Assemblys mixtes (natif et managé) ; pour /clr:pure, consultez Code pur et vérifiable (C++/CLI).

Pour créer une version Debug de votre application, l'indicateur _DEBUG doit être défini et l'application doit être liée à une version Debug de l'une de ces bibliothèques. 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.

Cette version de Visual C++ n'est pas conforme à la norme C99.

Bibliothèque C++ standard

Bibliothèque C++ standard

Caractéristiques

Option

Directives de préprocesseur

LIBCPMT.LIB

Multithread, liaison statique

/MT

_MT

MSVCPRT.LIB

Multithread, liaison dynamique, (bibliothèque d'importation pour MSVCP120.dll)

/MD

_MT, _DLL

LIBCPMTD.LIB

Multithread, liaison statique

/MTd

_DEBUG, _MT

MSVCPRTD.LIB

Multithread, liaison dynamique, (bibliothèque d'importation pour MSVCP120D.DLL)

/MDd

_DEBUG, _MT, _DLL

Remarque : LIBCP.LIB et LIBCPD.LIB (via les anciennes options /ML et /MLd) ont été supprimés. Utilisez à la place LIBCPMT.LIB et LIBCPMTD.LIB via les options /MT et /MTd.

Quand vous générez une version Release 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). Si vous incluez un des Fichiers d'en-tête de bibliothèque standard C++ dans votre code, une bibliothèque C++ standard est liée automatiquement par Visual C++ au moment de la compilation. Exemple :

#include <ios> 

Pour changer la bibliothèque Runtime C de base liée dans Visual Studio, ouvrez les pages de propriétés pour votre projet. Ouvrez la page Propriétés de configuration, C/C++, Génération de Code et changez le paramètre Bibliothèque Runtime. Pour changer la bibliothèque Common Language Runtime, ouvrez les pages de propriétés pour votre projet. Ouvrez la page Propriétés de configuration, C/C++, Général, puis changez le paramètre Prise en charge du Common Language Runtime.

Quelle est la différence entre msvcrt.dll et msvcr120.dll ?

Le fichier msvcrt.dll est désormais une « DLL connue », ce qui signifie qu'il est un composant système détenu et créé par Windows. Il est destiné à une utilisation future, uniquement par des composants de niveau système.

Quels sont les problèmes rencontrés si une application utilise à la fois msvcrt.dll et msvcr120.dll ?

Si vous avez un fichier .lib ou .obj qui doit être lié à msvcrt.lib, il n'est normalement pas nécessaire de le recompiler pour qu'il fonctionne avec le nouveau fichier msvcrt.lib dans Visual C++. Le fichier .lib ou .obj peut s'appuyer sur les tailles, les décalages des champs ou des noms de fonctions membres des différentes classes ou variables de la bibliothèque CRT, et ces éléments doivent tous encore exister sous une forme compatible. Quand vous liez à nouveau votre code à msvcrt.lib, votre image EXE et DLL finale a une dépendance vis-à-vis de msvcr120.dll, au lieu de msvcrt.dll.

Si vous avez plusieurs fichiers DLL ou EXE, vous pouvez avoir plusieurs bibliothèques CRT, que vous utilisiez ou non différentes versions de Visual C++. Par exemple, la liaison statique de la bibliothèque CRT dans plusieurs DLL peut présenter le même problème. Il a été demandé aux développeurs rencontrant ce problème avec des bibliothèques CRT statiques de compiler avec /MD pour utiliser la DLL de la bibliothèque CRT. Maintenant que la DLL de la bibliothèque CRT a été renommée en msvcr120.dll, les applications peuvent avoir certains composants liés à msvcrt.dll et d'autres liés à msvcr120.dll. Si vos DLL passent des ressources de la bibliothèque CRT à travers les limites de msvcrt.dll et de msvcr120.dll, vous allez rencontrer des problèmes de non-correspondance des bibliothèques CRT et vous devrez recompiler votre projet avec Visual C++.

Si votre programme utilise plusieurs versions de la bibliothèque CRT, une attention particulière est nécessaire pour passer certains objets CRT (comme les descripteurs de fichiers, les paramètres régionaux et les variables d'environnement) à travers les limites des DLL. Pour plus d'informations sur les problèmes rencontrés et comment les résoudre, consultez Erreurs potentielles de passage d'objets CRT entre frontières DLL.

Voir aussi

Autres ressources

Référence sur les bibliothèques Runtime C