Fonctionnalités de bibliothèque CRT
Cette rubrique présente les différents fichiers .lib qui composent les bibliothèques Runtime C, ainsi que leurs options du compilateur associé et directives du préprocesseur.
Bibliothèques Runtime c (CRT)
Les bibliothèques suivantes contiennent les fonctions c run-time library.
Bibliothèque Runtime c (sans iostream ou la bibliothèque C++ standard) |
DLL associée |
Caractéristiques |
Option |
Directives de préprocesseur |
---|---|---|---|---|
LIBCMT.lib. |
Aucune liaison statique. |
Lien statique, multithread |
_MT |
|
Msvcrt.lib. |
msvcr110.dll |
Multithread, dynamic link (bibliothèque d'importation pour MSVCR110.(DLL).Sachez que si vous utilisez la bibliothèque C++ Standard, votre programme doit MSVCP110.DLL pour s'exécuter. |
_MT, _DLL |
|
LIBCMTD.lib. |
None, lien statique |
Lien statique, multithread (débogage) |
/MTd |
_DEBUG, _MT |
MSVCRTD.lib. |
msvcr110d.dll |
Multithread, dynamic link (bibliothèque d'importation pour MSVCR110D.(DLL) (debug). |
/MDd |
_DEBUG, _MT, _DLL |
msvcmrt.lib |
None, lien statique |
Bibliothèque statique C Runtime.Utilisé pour le code managé/natif mixte. |
/clr /clr:oldSyntax |
|
Msvcurt.lib |
None, lien statique |
Bibliothèque statique de C Runtime compilée en code MSIL pur 100 %.Tout le code est conforme à la spécification ECMA URT pour MSIL. |
/clr:pure |
|
[!REMARQUE]
Le CRT monothread (libc.lib, libcd.lib) (anciennement le /ML ou /MLd options) n'est plus disponible.Au lieu de cela, utilisez le CRT multithread.Consultez Performances multithread de bibliothèques.
Si vous liez votre programme depuis la ligne de commande sans une option du compilateur qui spécifie 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 utilisé LIBC.LIB, la bibliothèque monothread, à la place.
L'utilisation du CRT lié de manière statique implique que les informations d'état enregistrées par la bibliothèque runtime c sera locales pour qu'une instance de la CRT.Par exemple, si vous utilisez strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l lorsque vous utilisez un CRT lié de manière statique, la position de la strtok parser est sans rapport avec la strtok état utilisé dans le code dans le même processus (mais dans une autre DLL ou EXE) qui est lié à une autre instance de la CRT statique.En revanche, le CRT lié dynamiquement partage état pour tout le code dans un processus qui est lié de manière dynamique au CRT.Ce problème 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.
Car une DLL générée en liant à un CRT statique aura son propre état CRT, il est déconseillé de lier statiquement vers le CRT dans une DLL, sauf si les conséquences de cela sont spécifiquement souhaités et entendus.Par exemple, si vous appelez _set_se_translator dans un fichier exécutable qui charge la DLL est lié à sa propre CRT statique, les exceptions de matériel générées par le code dans la DLL ne sont pas interceptées par le traducteur, mais les exceptions matérielles générées par le code dans le fichier exécutable principal va être interceptées.
Si vous utilisez le /clr commutateur de compilateur, votre code sera lié avec une bibliothèque statique, msvcmrt.lib.La bibliothèque statique fournit un proxy entre votre code géré et natif CRT.Vous ne pouvez pas utiliser le CRT lié de manière statique ( /MT ou /MTd options) avec /clr.Utiliser les bibliothèques liées dynamiquement (/MD ou /MDd) à la place.
Si vous utilisez le /clr:pure commutateur de compilateur, votre code sera lié avec la bibliothèque statique msvcurt.lib.Comme avec /clr, vous ne pouvez pas lier avec la bibliothèque liée statiquement.
Pour plus d'informations sur l'utilisation du CRT avec /clr, voir Assemblys mixtes (natif et managé); for /clr:pure, see Code pur et vérifiable (C++/CLI).
Pour générer une version debug de votre application, le _DEBUG indicateur doit être définie et l'application doit être liée à une version debug de l'une de ces bibliothèques.Pour plus d'informations sur les versions debug des bibliothèques, voir Techniques de débogage 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 |
Lien statique, multithread |
/MT |
_MT |
MSVCPRT.LIB |
Multithread, dynamic link (bibliothèque d'importation pour MSVCP110.dll) |
/MD |
_MT, _DLL |
LIBCPMTD.LIB |
Lien statique, multithread |
/MTd |
_DEBUG, _MT |
MSVCPRTD.LIB |
Multithread, dynamic link (bibliothèque d'importation pour MSVCP110D.DLL) |
/MDd |
_DEBUG, _MT, _DLL |
Remarque LIBCP.LIB et LIBCPD.LIB (via l'ancien /ML et /MLd options) ont été supprimés.Utilisez LIBCPMT.LIB et LIBCPMTD.LIB plutôt la /MT et /MTd options.
Lorsque vous générez une version finale de votre projet, une des base c run-time libraries (LIBCMT.LIB, MSVCMRT.LIB, MSVCRT.(LIB) est lié par défaut, en fonction de l'option du compilateur vous choisissez (multithread, DLL, /clr).Si vous incluez un de le Fichiers d'en-tête dans votre code, une bibliothèque C++ Standard seront connectée d'automatiquement par Visual C++ au moment de la compilation.Par exemple :
#include <ios>
Quelle est la différence entre le msvcrt.dll et msvcr110.dll ?
Le msvcrt.dll est désormais une « DLL connue » signifiant qu'elle est un composant système propriétaire et créée par Windows.Il est destiné pour un usage futur uniquement par les composants de niveau système.
Quels sont les problèmes existent si une application utilise le msvcrt.dll et msvcr110.dll ?
Si vous avez un fichier .lib ou .obj qui doit lier à msvcrt.lib, doit avoir pas recompiler qu'il fonctionne avec le nouveau msvcrt.lib dans Visual C++.Le fichier .lib ou .obj peut s'appuyer sur les tailles, les offsets de champ ou les noms de fonctions membres de différentes classes CRT ou des variables, et celles doivent tous existent toujours d'une manière compatible.Lorsque vous liez à nouveau contre msvcrt.lib, votre image finale EXE et DLL aura maintenant une dépendance sur msvcr110.dll au lieu de msvcrt.dll.
Si vous avez plusieurs DLL ou EXE, puis vous pouvez avoir plusieurs CRT, ou non à l'aide de différentes versions de Visual C++.Par exemple, le liant statiquement le CRT dans plusieurs DLL peut présenter le même problème.Les développeurs vous rencontrez ce problème avec les écrans CRT statiques ont été invités à compiler avec /MD pour utiliser la DLL CRT.Maintenant que la DLL CRT a été renommée en msvcr110.dll, les applications peuvent avoir certains composants liés aux msvcrt.dll et d'autres à msvcr110.dll.Si votre DLL transmettre la frontière msvcrt.dll et msvcr110.dll ressources CRT, vous rencontrez des problèmes avec les écrans CRT ne correspondent pas et est nécessaire de recompiler votre projet avec Visual C++.
Si votre programme est à l'aide de plusieurs versions du CRT, certains soins est nécessaire lors du passage de certains objets CRT (telles que les handles de fichiers, les paramètres régionaux et les variables d'environnement) au-delà des limites de la DLL.Pour plus d'informations sur les problèmes impliqués et comment les résoudre, consultez Erreurs potentielles passage d'objets CRT au delà de les limites de DLL.