Características de la biblioteca CRTCRT Library Features

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.This topic discusses the various .lib files that comprise the C run-time libraries as well as their associated compiler options and preprocessor directives.

Bibliotecas en tiempo de ejecución de C (CRT)C Run-Time Libraries (CRT)

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.The C Run-time Library (CRT) is the part of the C++ Standard Library that incorporates the ISO C99 standard library. Las bibliotecas de Visual C++ que implementan CRT admiten el desarrollo de código nativo, así como código mixto (nativo y administrado) y código administrado.The Visual C++ libraries that implement the CRT support native code development, and both mixed native and managed code. Todas las versiones de CRT admiten el desarrollo multiproceso.All versions of the CRT support multi-threaded development. 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.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.

A partir de Visual Studio 2015, el CRT se ha refactorizado en nuevos binarios.Starting in Visual Studio 2015, the CRT has been refactored into new binaries. CRT Universal (UCRT) contiene las funciones y variables globales exportadas por la biblioteca CRT del estándar C99.The Universal CRT (UCRT) contains the functions and globals exported by the standard C99 CRT library. El UCRT ahora es un componente de Windows y se incluye en Windows 10.The UCRT is now a Windows component, and ships as part of 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.The static library, DLL import library, and header files for the UCRT are now found in the Windows 10 SDK. 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.When you install Visual C++, Visual Studio setup installs the subset of the Windows 10 SDK required to use the UCRT. Se puede usar el UCRT en cualquier versión de Windows compatible con Visual Studio 2015 y versiones posteriores.You can use the UCRT on any version of Windows supported by Visual Studio 2015 and later versions. También se puede redistribuir mediante vcredist para las versiones compatibles de Windows que no sean Windows 10.You can redistribute it using vcredist for supported versions of Windows other than Windows 10. Para obtener más información, consulte Redistribuir archivos de Visual C++.For more information, see Redistributing Visual C++ Files.

En la tabla siguiente se muestran las bibliotecas que implementan el UCRT.The following table lists the libraries that implement the UCRT.

BibliotecaLibrary DLL asociadoAssociated DLL CaracterísticasCharacteristics OpciónOption Directivas de preprocesadorPreprocessor directives
libucrt.lib NingunoNone Vincula estáticamente el UCRT en el código.Statically links the UCRT into your code. /MT _MT
libucrtd.lib NingunoNone Versión de depuración del UCRT para la vinculación estática.Debug version of the UCRT for static linking. No redistribuible.Not redistributable. /MTd _DEBUG, _MT_DEBUG, _MT
ucrt.lib ucrtbase.dll Biblioteca de importación de DLL para el UCRT.DLL import library for the UCRT. /MD _MT, _DLL_MT, _DLL
ucrtd.lib ucrtbased.dll Biblioteca de importación de DLL para la versión de depuración del UCRT.DLL import library for the Debug version of the UCRT. No redistribuible.Not redistributable. /MDd _DEBUG, _MT, _DLL_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.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. Esta biblioteca es específica de la versión del compilador que se use.This library is specific to the version of the compiler used.

En la siguiente tabla se muestran las bibliotecas que implementan la biblioteca vcruntime.This table lists the libraries that implement the vcruntime library.

BibliotecaLibrary DLL asociadoAssociated DLL CaracterísticasCharacteristics OpciónOption Directivas de preprocesadorPreprocessor directives
libvcruntime.lib NingunoNone Se vincula estáticamente en el código.Statically linked into your code. /MT _MT
libvcruntimed.lib NingunoNone Versión de depuración para la vinculación estática.Debug version for static linking. No redistribuible.Not redistributable. /MTd _MT, _DEBUG_MT, _DEBUG
vcruntime.lib vcruntime<version>.dll Biblioteca de importación de DLL para vcruntime.DLL import library for the vcruntime. /MD _MT, _DLL_MT, _DLL
vcruntimed.lib vcruntime<version>d.dll Biblioteca de importación de DLL para vcruntime de depuración.DLL import library for the Debug vcruntime. No redistribuible.Not redistributable. /MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

Nota

Cuando se produce la refactorización de UCRT, las funciones de Runtime de simultaneidad se movieron a concrt140.dll , que se agregó al paquete redistribuible de C++.When the UCRT refactoring occurred, the Concurrency Runtime functions were moved into concrt140.dll, which was added to the C++ redistributable package. Esta DLL es necesaria para los algoritmos y los contenedores paralelos de C++, como concurrency::parallel_for.This DLL is required for C++ parallel containers and algorithms such as concurrency::parallel_for. Además, la biblioteca estándar de C++ requiere que esta DLL en Windows XP admita primitivas de sincronización, dado que Windows XP no tiene variables de condición.In addition, the C++ Standard Library requires this DLL on Windows XP to support synchronization primitives, because Windows XP does not have condition variables.

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.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. Este código controla el inicio de CRT, la inicialización de datos internos por subproceso y la terminación.This code handles CRT startup, internal per-thread data initialization, and termination. Es específico de la versión del compilador que se use.It is specific to the version of the compiler used. Esta biblioteca siempre se vincula estáticamente, incluso cuando se usa un UCRT vinculado dinámicamente.This library is always statically linked, even when using a dynamically linked UCRT.

En la siguiente tabla se muestran las bibliotecas que implementan la inicialización y la terminación de CRT.This table lists the libraries that implement CRT initialization and termination.

BibliotecaLibrary CaracterísticasCharacteristics OpciónOption Directivas de preprocesadorPreprocessor directives
libcmt.lib Vincula estáticamente el inicio de CRT nativo en el código.Statically links the native CRT startup into your code. /MT _MT
libcmtd.lib Vincula estáticamente la versión de depuración del inicio de CRT nativo.Statically links the Debug version of the native CRT startup. No redistribuible.Not redistributable. /MTd _DEBUG, _MT_DEBUG, _MT
msvcrt.lib Biblioteca estática para el inicio de CRT nativo para su uso con UCRT y vcruntime de DLL.Static library for the native CRT startup for use with DLL UCRT and vcruntime. /MD _MT, _DLL_MT, _DLL
msvcrtd.lib Biblioteca estática para la versión de depuración de inicio de CRT nativo para su uso con UCRT y vcruntime de DLL.Static library for the Debug version of the native CRT startup for use with DLL UCRT and vcruntime. No redistribuible.Not redistributable. /MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL
msvcmrt.lib Biblioteca estática para el inicio de CRT mixto (nativo y administrado) para su uso con UCRT y vcruntime de DLL.Static library for the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. /clr
msvcmrtd.lib Biblioteca 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.Static library for the Debug version of the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. No redistribuible.Not redistributable. /clr
msvcurt.lib En desuso Biblioteca estática para CRT administrado puro.Deprecated Static library for the pure managed CRT. /clr:pure
msvcurtd.lib En desuso Biblioteca estática para la versión de depuración de CRT administrado puro.Deprecated Static library for the Debug version of the pure managed CRT. No redistribuible.Not redistributable. /clr:pure

Si vincula el programa desde la línea de comandos sin una opción del 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 .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.

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.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. Por ejemplo, si usa strtok al usar un CRT vinculado estáticamente, la posición del strtok analizador no está relacionada con el strtok Estado utilizado en el código en el mismo proceso (pero en otro archivo dll o exe) vinculado a otra instancia de CRT estático.For example, if you use strtok 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. 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.In contrast, the dynamically linked CRT shares state for all code within a process that is dynamically linked to the 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.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.

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.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. Por ejemplo, si llama a _set_se_translator en un archivo ejecutable que carga el archivo dll vinculado a su propio CRT estático, el traductor no detectará ninguna excepción de hardware generada por el código en el archivo dll, pero se detectarán las excepciones de hardware generadas por el código del archivo ejecutable principal.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 usa el /clr modificador de compilador, el código se vinculará a una biblioteca estática, msvcmrt. lib.If you are using the /clr compiler switch, your code will be linked with a static library, msvcmrt.lib. La biblioteca estática proporciona un proxy entre el código administrado y CRT nativo.The static library provides a proxy between your managed code and the native CRT. No se puede usar el CRT vinculado estáticamente ( /MT o /MTd las opciones) con /clr .You cannot use the statically linked CRT ( /MT or /MTd options) with /clr. En su lugar, use las bibliotecas vinculadas dinámicamente ( /MD o /MDd ).Use the dynamically-linked libraries (/MD or /MDd) instead. Las bibliotecas de CRT administradas puras están en desuso en Visual Studio 2015 y no se admiten en Visual Studio 2017.The pure managed CRT libraries are deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017.

Para obtener más información sobre el uso de CRT con /clr , consulte ensamblados mixtos (nativos y administrados).For more information on using the CRT with /clr, see Mixed (Native and Managed) Assemblies.

Para compilar una versión de depuración de la aplicación, _DEBUG debe definirse la marca y la aplicación debe estar vinculada a una versión de depuración de una de estas bibliotecas.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. 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.For more information about using the debug versions of the library files, see CRT Debugging Techniques.

Esta versión de CRT no es totalmente compatible con el estándar C99.This version of the CRT is not fully conformant with the C99 standard. En las versiones anteriores a la versión 16,8 de Visual Studio 2019, <tgmath.h> no se admite el encabezado.In versions before Visual Studio 2019 version 16.8, the <tgmath.h> header is not supported. En todas las versiones, CX_LIMITED_RANGE FP_CONTRACT no se admiten las macros pragma y.In all versions, the CX_LIMITED_RANGE and FP_CONTRACT pragma macros are not supported. 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.Certain elements such as the meaning of parameter specifiers in standard IO functions use legacy interpretations by default. Puede utilizar /Zc las opciones de conformidad del compilador y especificar las opciones del enlazador para controlar algunos aspectos del cumplimiento de la biblioteca.You can use /Zc compiler conformance options and specify linker options to control some aspects of library conformance.

Biblioteca estándar de C++C++ Standard Library

Biblioteca estándar de C++C++ Standard Library CaracterísticasCharacteristics OpciónOption Directivas de preprocesadorPreprocessor directives
libcpmt.lib Vínculo multiproceso, estáticoMultithreaded, static link /MT _MT
msvcprt.lib Vínculo multiproceso y dinámico (biblioteca de importación para msvcp<version>.dll )Multithreaded, dynamic link (import library for msvcp<version>.dll) /MD _MT, _DLL_MT, _DLL
libcpmtd.lib Vínculo multiproceso, estáticoMultithreaded, static link /MTd _DEBUG, _MT_DEBUG, _MT
msvcprtd.lib Vínculo multiproceso y dinámico (biblioteca de importación para msvcp<version>d.dll )Multithreaded, dynamic link (import library for msvcp<version>d.dll) /MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

Al compilar una versión de lanzamiento del proyecto, una de las bibliotecas en tiempo de ejecución de C básicas ( libcmt.lib , msvcmrt.lib , msvcrt.lib ) se vincula de forma predeterminada, dependiendo de la opción del compilador que elija (multiproceso, 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 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.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. Por ejemplo:For example:

#include <ios>

Para la compatibilidad binaria, es posible que sea necesario especificar más de un archivo .dll mediante una única biblioteca de importación.For binary compatibility, more than one DLL file may be specified by a single import library. Asimismo, las actualizaciones de versión pueden introducir bibliotecas DOT, es decir, .dll independientes con nuevas funcionalidades de biblioteca.Version updates may introduce dot libraries, separate DLLs that introduce new library functionality. Por ejemplo, la versión 15,6 de Visual Studio 2017 msvcp140_1.dll se presentó para admitir la funcionalidad adicional de la biblioteca estándar sin interrumpir la ABI que admite 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 msvcprt.lib biblioteca de importación incluida en el conjunto de herramientas para Visual Studio 2017 versión 15,6 admite ambos archivos dll y el vcredist para esta versión instala ambos archivos 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. Una vez enviada, una biblioteca DOT tendrá un ABI fijo, y nunca presentará ninguna dependencia con una biblioteca DOT posterior.Once shipped, a dot library has a fixed ABI, and will never have a dependency on a later dot library.

¿Qué problemas existen si una aplicación usa más de una versión de CRT?What problems exist if an application uses more than one CRT version?

Cada imagen ejecutable (EXE o DLL) puede tener su propio CRT vinculado estáticamente, o puede vincularse dinámicamente a CRT.Every executable image (EXE or DLL) can have its own statically linked CRT, or can dynamically link to a CRT. La versión de CRT incluida estáticamente o cargada dinámicamente mediante una imagen determinada depende de la versión de las herramientas y bibliotecas con que se haya compilado.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 solo proceso puede cargar varias imágenes EXE y DLL, cada una con su propio CRT.A single process may load multiple EXE and DLL images, each with its own CRT. Cada uno de los CRT puede usar un asignador diferente, puede tener diferentes diseños estructura interna y puede usar diferentes disposiciones de almacenamiento.Each of those CRTs may use a different allocator, may have different internal structure layouts, and may use different storage arrangements. Esto significa que la memoria asignada, los recursos de CRT o las clases que se pasan a través de un límite DLL pueden causar problemas en la administración de memoria, el uso estático interno o la interpretación de diseño.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. Por ejemplo, si se asigna una clase en un archivo DLL, pero se pasa y se elimina por otro, ¿qué desasignador de CRT se usa?For example, if a class is allocated in one DLL but passed to and deleted by another, which CRT deallocator is used? Los errores causados pueden oscilar entre algo sutil o inmediatamente crítico; por eso, se desaconseja la transferencia directa de estos recursos.The errors caused can range from the subtle to the immediately fatal, and therefore direct transfer of such resources is strongly discouraged.

Puede evitar muchos de estos problemas empleando las tecnologías de la interfaz binaria de aplicaciones, ya que están diseñadas para ser estables y versionables.You can avoid many of these issues by using Application Binary Interface (ABI) technologies instead, as they are designed to be stable and versionable. Diseñe las interfaces de exportación de DLL para pasar información por valor, o para trabajar en la memoria que se pasa por el autor de llamada en lugar de la asignada localmente que se devuelve al autor de llamada.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. Use técnicas de serialización para copiar datos estructurados entre imágenes ejecutables.Use marshaling techniques to copy structured data between executable images. Encapsule recursos localmente y permita solo la manipulación a través de identificadores o funciones que exponga a los clientes.Encapsulate resources locally and only allow manipulation through handles or functions you expose to clients.

También es posible evitar algunos de estos problemas si todas las imágenes del proceso usan la misma versión cargada dinámicamente de 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. Para asegurarse de que todos los componentes utilizan la misma versión de DLL de CRT, genérelo mediante la /MD opción y use el mismo conjunto de herramientas de compilador y los mismos valores de propiedad.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.

Tenga cuidado si el programa pasa determinados recursos de CRT a través de los límites de DLL.Be careful if your program passes certain CRT resources across DLL boundaries. Los recursos, como identificadores de archivo, configuraciones regionales y variables de entorno, pueden causar problemas, incluso cuando se usa la misma versión de CRT.Resources such as file handles, locales, and environment variables can cause problems, even when using the same version of the CRT. 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.For more information on the issues involved and how to resolve them, see Potential Errors Passing CRT Objects Across DLL Boundaries.

Vea tambiénSee also