Características de la biblioteca CRT

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

En este tema se describen los distintos archivos .lib que forman las bibliotecas en tiempo de ejecución de C, así como las opciones de compilador y las directivas de preprocesador asociadas.

La biblioteca de tiempo de ejecución de C (CRT) es la parte de la biblioteca estándar de C++ que incorpora la biblioteca del estándar ISO C99. Las bibliotecas de Visual C++ que implementan el CRT admiten el desarrollo de código nativo, así como código mixto (nativo y administrado) y código administrado puro para el desarrollo de .NET. Todas las versiones de CRT admiten el desarrollo multiproceso. La mayoría de las bibliotecas admite la vinculación estática, para vincular la biblioteca directamente en el código, o la vinculación dinámica para permitir que el código use archivos DLL comunes.

En Visual Studio 2015, CRT se ha refactorizado en nuevos archivos binarios. CRT Universal (UCRT) contiene las funciones y variables globales exportadas por la biblioteca CRT del estándar C99. El UCRT ahora es un componente de Windows y se incluye en Windows 10. La biblioteca estática, la biblioteca de importación de DLL y los archivos de encabezado para el UCRT ahora se encuentran en el SDK de Windows 10. Cuando se instala Visual C++, el programa de instalación de Visual Studio instala el subconjunto del SDK de Windows 10 necesario para usar el UCRT. Se puede usar el UCRT en cualquier versión de Windows compatible con Visual Studio 2015. También se puede redistribuir mediante vcredist para las versiones compatibles de Windows que no sean Windows 10. Para obtener más información, vea Redistribuir archivos de Visual C++.

En la tabla siguiente se muestran las bibliotecas que implementan el UCRT.

BibliotecaDLL asociadoCaracterísticasOpciónDirectivas de preprocesador
libucrt.libNingunaVincula estáticamente el UCRT en el código./MT_MT
libucrtd.libNingunoVersión de depuración del UCRT para la vinculación estática. No redistribuible./MTd_DEBUG, _MT
ucrt.libucrtbase.dllBiblioteca de importación de DLL para el UCRT./MD_MT, _DLL
ucrtd.libucrtbased.dllBiblioteca de importación de DLL para la versión de depuración del UCRT. No redistribuible./MDd_DEBUG, _MT, _DLL

La biblioteca de vcruntime contiene código específico de la implementación de CRT en Visual C++ como, por ejemplo, compatibilidad con la depuración y el control de excepciones, comprobaciones en tiempo de ejecución e información de tipos, detalles de la implementación y determinadas funciones de biblioteca ampliada. Esta biblioteca es específica de la versión del compilador que se use.

En la siguiente tabla se muestran las bibliotecas que implementan la biblioteca vcruntime.

BibliotecaDLL asociadoCaracterísticasOpciónDirectivas de preprocesador
libvcruntime.libNingunoSe vincula estáticamente en el código./MT_MT
libvcruntimed.libNingunaVersión de depuración para la vinculación estática. No redistribuible./MTd_MT, _DEBUG
vcruntime.libvcruntime<version>.dllBiblioteca de importación de DLL para vcruntime./MD_MT, _DLL
vcruntimed.libvcruntime<version>d.dllBiblioteca de importación de DLL para vcruntime de depuración. No redistribuible./MDd_DEBUG, _MT, _DLL

El código que inicializa el CRT está en una de varias bibliotecas, en función de si la biblioteca CRT está vinculada estática o dinámicamente o es código nativo, administrado o mixto. Este código controla el inicio de CRT, la inicialización de datos internos por subproceso y la terminación. Es específico de la versión del compilador que se use. Esta biblioteca siempre se vincula estáticamente, incluso cuando se usa un UCRT vinculado dinámicamente.

En la siguiente tabla se muestran las bibliotecas que implementan la inicialización y la terminación de CRT.

BibliotecaCaracterísticasOpciónDirectivas de preprocesador
libcmt.libVincula estáticamente el inicio de CRT nativo en el código./MT_MT
libcmtd.libVincula estáticamente la versión de depuración del inicio de CRT nativo. No redistribuible./MTd_DEBUG, _MT
msvcrt.libBiblioteca estática para el inicio de CRT nativo para su uso con UCRT y vcruntime de DLL./MD_MT, _DLL
msvcrtd.libBiblioteca estática para la versión de depuración de inicio de CRT nativo para su uso con UCRT y vcruntime de DLL. No redistribuible./MDd_DEBUG, _MT, _DLL
msvcmrt.libBiblioteca estática para el inicio de CRT mixto (nativo y administrado) para su uso con UCRT y vcruntime de DLL./clr
msvcmrtd.libBiblioteca estática para la versión de depuración del inicio de CRT mixto (nativo y administrado) para su uso con UCRT y vcruntime de DLL. No redistribuible./clr
msvcurt.libBiblioteca estática para CRT administrado puro./clr:pure
msvcurtd.libBiblioteca estática para la versión de depuración de CRT administrado puro. No redistribuible./clr:pure

Si vincula el programa desde la línea de comandos sin una opción de compilador que especifique una biblioteca en tiempo de ejecución de C, el enlazador usará las bibliotecas de CRT vinculadas estáticamente: libcmt.lib, libvcruntime.lib y libucrt.lib.

El uso de CRT vinculado estáticamente implica que toda información de estado que guarde la biblioteca en tiempo de ejecución de C será local en esa instancia de CRT. Por ejemplo, si usa strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l cuando se use CRT vinculado estáticamente, la posición del analizador de strtok no tiene relación con el estado de strtok que se usa en el código en el mismo proceso (pero en otro archivo DLL o EXE) vinculado a otra instancia de CRT estático. Por el contrario, CRT vinculado dinámicamente tiene el mismo estado para todo el código de un proceso que se vincule dinámicamente a CRT. Este problema no se da si usa las nuevas versiones más seguras de estas funciones. Por ejemplo, strtok_s no presenta este problema.

Dado que un archivo DLL compilado mediante la vinculación a CRT estático tendrá su propio estado de CRT, no se recomienda para vincular estáticamente a CRT en un archivo DLL, a menos que las consecuencias de hacerlo se entiendan y se deseen obtener. Por ejemplo, si llama a _set_se_translator en un archivo ejecutable que cargue el DLL vinculado a su propio CRT estático, el traductor no detectará ninguna excepción de hardware que genere el código del archivo DLL, pero se detectarán las excepciones de hardware que genere el código del archivo ejecutable principal.

Si usa el modificador de compilador /clr, el código se vinculará a una biblioteca estática, msvcmrt.lib. La biblioteca estática proporciona un proxy entre el código administrado y CRT nativo. CRT vinculado estáticamente (opciones /MT o /MTd) no se puede usar con /clr. En su lugar, use las bibliotecas vinculadas dinámicamente (/MD o /MDd).

Si usa el modificador de compilador /clr:pure, el código se vinculará a la biblioteca estática msvcurt.lib. Lo mismo que con /clr, no se puede vincular a la biblioteca estática vinculada.

Para obtener más información sobre cómo usar CRT con /clr, vea Ensamblados mixtos (nativos y administrados); para /clr:pure, vea Código puro y comprobable.

Para compilar una versión de depuración de la aplicación, debe estar definida la marca _DEBUG y la aplicación se debe vincular a una versión de depuración de una de estas bibliotecas. Para obtener más información sobre cómo usar las versiones de depuración de los archivos de biblioteca, vea Técnicas de depuración de CRT.

Esta versión de CRT no es totalmente compatible con el estándar C99. En concreto, no se admiten el encabezado <tgmath.h> ni las macros pragma CX_LIMITED_RANGE/FP_CONTRACT. Determinados elementos como el significado de los especificadores de parámetros en las funciones estándar de E/S usan interpretaciones heredadas de forma predeterminada. Se pueden usar opciones de conformidad del compilador /Zc y se pueden especificar las opciones del enlazador para controlar algunos aspectos de cumplimiento de la biblioteca.

Biblioteca estándar de C++CaracterísticasOpciónDirectivas de preprocesador
LIBCPMT.LIBVínculo multiproceso, estático/MT_MT
MSVCPRT.LIBVínculo multiproceso, dinámico (biblioteca de importación para MSVCP<version>.dll)/MD_MT, _DLL
LIBCPMTD.LIBVínculo multiproceso, estático/MTd_DEBUG, _MT
MSVCPRTD.LIBVínculo multiproceso, dinámico (biblioteca de importación para MSVCP<version>D.DLL)/MDd_DEBUG, _MT, _DLL

Cuando compile una versión de lanzamiento del proyecto, una de las bibliotecas en tiempo de ejecución básicas de C (LIBCMT.LIB, MSVCMRT.LIB, MSVCRT.LIB) se vinculará de forma predeterminada, según la opción de compilador que elija (multiproceso, DLL, /clr). Si incluye uno de los Referencia de archivos de encabezado en el código, Visual C++ vinculará automáticamente una biblioteca estándar de C++ en tiempo de compilación. Por ejemplo:

#include <ios>   

Si tiene más de un archivo DLL o EXE, puede tener varios CRT, independientemente de que use distintas versiones de Visual C++. Por ejemplo, la vinculación estática de CRT a varios archivos DLL puede presentar el mismo problema. Se ha indicado a los desarrolladores que tienen este problema con CRT estáticos que compilen con /MD para usar el archivo DLL de CRT. Si los archivos DLL pasan recursos de CRT a través del límite de DLL, se producirán problemas de CRT dispares y habrá que volver a compilar el proyecto con Visual C++.

Si el programa usa más de una versión de CRT, es necesario prestar atención al pasar ciertos objetos de CRT (por ejemplo identificadores de archivo, configuraciones regionales y variables de entorno) a través de los límites de los archivos DLL. Para obtener más información sobre los posibles problemas y cómo resolverlos, consulte Errores potenciales que pasan los objetos de CRT entre los límites de DLL.

Referencia de la biblioteca en tiempo de ejecución de C

Mostrar: