Características de la biblioteca CRT
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.
Bibliotecas en tiempo de ejecución de C (CRT)
Las bibliotecas siguientes contienen las funciones de biblioteca en tiempo de ejecución de C.
Biblioteca en tiempo de ejecución de C (sin iostream ni la biblioteca estándar de C++) |
DLL asociado |
Características |
Opción |
Directivas de preprocesador |
---|---|---|---|---|
libcmt.lib |
Ninguno, vínculo estático |
Vínculo multiproceso, estático |
_MT |
|
msvcrt.lib |
msvcr110.dll |
Vínculo multiproceso, dinámico (biblioteca de importación para MSVCR110 .DLL). Tenga en cuenta que si usa la biblioteca estándar de C++, el programa necesitará MSVCP110 .DLL ejecutarse. |
_MT, _DLL |
|
libcmtd.lib |
Ninguno, vínculo estático |
Vínculo multiproceso, estático (depuración) |
/MTd |
_DEBUG, _MT |
msvcrtd.lib |
msvcr110d.dll |
Vínculo multiproceso, dinámico (biblioteca de importación para MSVCR110D.DLL .DLL) (depuración). |
/MDd |
_DEBUG, _MT, _DLL |
msvcmrt.lib |
Ninguno, vínculo estático |
Biblioteca estático en tiempo de ejecución de C. Se usa para código mixto, administrado y nativo. |
/clr /clr:oldSyntax |
|
msvcurt.lib |
Ninguno, vínculo estático |
Biblioteca estática en tiempo de ejecución de C compilada como código puro 100 % de MSIL. Todo el código cumple la especificación de ECMA URT para MSIL. |
/clr:pure |
|
Nota
CRT de un único subproceso (libc.lib, libcd.lib) (anteriormente, opciones /ML o /MLd) ya no está disponible.En su lugar, use CRT multiproceso.Vea Rendimiento de bibliotecas multiproceso.
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 vinculador usará LIBCMT.LIB. Es un comportamiento distinto al de las versiones anteriores de Visual C++, en las que se usaba LIBC.LIB, la biblioteca de un único subproceso.
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 usado 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 (C++/CLI).
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 Visual C++ no es compatible con el estándar C99.
Biblioteca estándar de C++
Biblioteca estándar de C++ |
Características |
Opción |
Directivas de preprocesador |
---|---|---|---|
LIBCPMT.LIB |
Vínculo multiproceso, estático |
/MT |
_MT |
MSVCPRT.LIB |
Vínculo multiproceso, dinámico (biblioteca de importación para MSVCP110 .dll) |
/MD |
_MT, _DLL |
LIBCPMTD.LIB |
Vínculo multiproceso, estático |
/MTd |
_DEBUG, _MT |
MSVCPRTD.LIB |
Vínculo multiproceso, dinámico (biblioteca de importación para MSVCP110D.DLL) |
/MDd |
_DEBUG, _MT, _DLL |
Nota LIBCP.LIB y LIBCPD.LIB (mediante las opciones anteriores /ML y /MLd) se han quitado. En su lugar, use LIBCPMT.LIB y LIBCPMTD.LIB mediante las opciones /MT y /MTd.
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 Archivos de encabezado de la biblioteca estándar de C++ en el código, Visual C++ vinculará automáticamente una biblioteca estándar de C++ en tiempo de compilación. Por ejemplo:
#include <ios>
Diferencia entre msvcrt.dll y msvcr110.dll
El archivo msvcrt.dll es ahora un “DLL conocido”, es decir, es un componente del sistema compilado por Windows y de su propiedad. Se ha diseñado para uso en el futuro solo por parte de componentes de nivel de sistema.
Problemas derivados del uso de msvcrt.dll y msvcr110.dll en una aplicación
Si tiene un archivo .lib o .obj que se debe vincular a msvcrt.lib, no tendría que volver a compilarlo para que funcione con el nuevo archivo msvcrt.lib de Visual C++. El archivo .lib o .obj puede basarse en los tamaños, desplazamientos de campo o nombres de función miembro de diversas clases o variables de CRT, que todavía deben existir de una forma compatible. Si vuelve a vincular a msvcrt.lib, la imagen final de EXE y DLL dependerá ahora de msvcr110.dll en lugar de msvcrt.dll.
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. Ahora que el nombre del archivo DLL de CRT ha cambiado a msvcr110.dll, algunos componentes de las aplicaciones pueden estar vinculados a msvcrt.dll y otros a msvcr110.dll. Si los archivos DLL pasan recursos de CRT a través del límite de msvcrt.dll y msvcr110.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, vea Errores potenciales que pasan los objetos de CRT entre los límites de DLL.