Actualizar código a CRT universal

Se ha refactorizado la Biblioteca en tiempo de ejecución de C (CRT) de Microsoft en Visual Studio 2015. La biblioteca estándar de C, las extensiones POSIX y las funciones, las macros y las variables globales específicas de Microsoft se han movido a una nueva biblioteca: la biblioteca en tiempo de ejecución de C universal (CRT universal o UCRT). Los componentes específicos del compilador de CRT se han movido a una nueva biblioteca de vcruntime.

El UCRT ahora es un componente de Windows y se incluye en Windows 10 y posteriores. UCRT admite un ABI estable basado en convenciones de llamada de C y se ajusta al estándar ISO C99, con solo unas pocas excepciones. Ya no está vinculada a una versión concreta del compilador. UCRT se puede usar en cualquier versión de Windows compatible con Visual Studio 2015 o Visual Studio 2017. La ventaja es que ya no es necesario actualizar las compilaciones destinadas a una nueva versión de CRT con cada actualización de Visual Studio.

La refactorización ha cambiado los nombres o las ubicaciones de muchos archivos de encabezado de CRT, archivos de biblioteca y Redistributable, así como los métodos de implementación necesarios para el código. Muchas funciones y macros de UCRT también se han agregado o cambiado para mejorar la conformidad con los estándares. Para aprovechar estos cambios, se deben actualizar el código existente y los sistemas de compilación de proyectos.

Dónde encontrar los archivos de CRT universal

Como componente de Windows, los encabezados y los archivos de biblioteca UCRT ahora forman parte del kit de desarrollo de software (SDK) de Windows. Cuando se instala Visual Studio, también se instalan los elementos del SDK de Windows necesarios para usar UCRT. El instalador de Visual Studio agrega las ubicaciones de los encabezados UCRT, las bibliotecas y los archivos DLL a las rutas de acceso predeterminadas empleadas por el sistema de compilación de proyectos de Visual Studio. Al actualizar los proyectos de Visual Studio C++, si usan la configuración de proyecto predeterminada, el IDE busca las nuevas ubicaciones de los archivos de encabezado de forma automática. Además, el enlazador usa las nuevas bibliotecas UCRT y vcruntime predeterminadas de forma automática. De forma similar, si usa un símbolo del sistema para desarrolladores para las compilaciones de línea de comandos, las variables de entorno que contienen rutas de acceso para encabezados y bibliotecas se actualizan y además funcionan automáticamente.

Los archivos de encabezado de la biblioteca estándar de C ahora se encuentran en el SDK de Windows en una carpeta de inclusión en un directorio específico de la versión del SDK. Una ubicación típica de los archivos de encabezado es el directorio Archivos de programa o Archivos de programa (x86) en Windows Kits\10\Include\[sdk-version]\ucrt, donde [sdk-version] corresponde a una versión o actualización de Windows, por ejemplo, 10.0.14393.0 para la Actualización de aniversario de Windows 10.

Las bibliotecas estáticas UCRT y las bibliotecas de código auxiliar de vínculo dinámico se encuentran en el directorio Archivos de programa o Archivos de programa (x86) en Windows Kits\10\Lib\[sdk-version]\ucrt\[architecture], donde architecture es ARM64, x86 o X64. Las bibliotecas estáticas comerciales y de depuración son libucrt.lib y libucrtd.lib, y las bibliotecas para los archivos DLL de UCRT son ucrt.lib y ucrtd.lib.

Los archivos DLL UCRT comerciales y de depuración se encuentran en ubicaciones independientes. Los archivos DLL comerciales son archivos Redistributable y se pueden encontrar en el directorio de Archivos de programa o Archivos de programa (x86) en Windows Kits\10\Redist\ucrt\DLLs\[architecture]\. Las bibliotecas UCRT de depuración no son archivos Redistributable y se pueden encontrar en el directorio Archivos de programa o Archivos de programa (x86) en la carpeta Windows Kits\10\bin\[architecture]\ucrt.

Dónde encontrar las bibliotecas y encabezados estándar

La biblioteca de compatibilidad en tiempo de ejecución específica del compilador de C y C++, vcruntime, contiene el código necesario para admitir el inicio del programa y características como el control de excepciones y los valores intrínsecos. La biblioteca y sus archivos de encabezado todavía se encuentran en la carpeta de Microsoft Visual Studio específica de la versión del directorio Archivos de programa o Archivos de programa (x86).

En Visual Studio 2017, 2019 y 2022, los archivos de encabezado se encuentran en Microsoft Visual Studio\[year]\[edition]\VC\Tools\MSVC\[lib-version]\include. Aquí, [year] es la versión de Visual Studio, [edition] es la edición o alias de Visual Studio y [lib-version] es la versión de compilación de las bibliotecas.

Las bibliotecas de vínculos se encuentran en Microsoft Visual Studio\[year]\[edition]\VC\Tools\MSVC\[lib-version]\lib\[architecture], donde [year] es la versión de Visual Studio, [edition] es la edición o alias de Visual Studio, [lib-version] es la versión de compilación de las bibliotecas y [architecture] es la arquitectura del procesador de destino. Las bibliotecas de vínculos para OneCore y la tienda también se encuentran en la carpeta de bibliotecas.

Las versiones comerciales y de depuración de la biblioteca estática son libvcruntime.lib y libvcruntimed.lib. Las bibliotecas de código auxiliar de depuración y comercial de vínculos dinámicos son vcruntime.lib y vcruntimed.lib, respectivamente.

Al actualizar los proyectos de Visual Studio C++, si ha establecido la propiedad Omitir todas las bibliotecas predeterminadas del Enlazador del proyecto en o si usa la opción /NODEFAULTLIB del enlazador en la línea de comandos, debe actualizar la lista de bibliotecas para incluir las nuevas bibliotecas refactorizadas. Reemplace la biblioteca CRT antigua, por ejemplo, libcmt.lib, libcmtd.lib, msvcrt.lib o msvcrtd.lib, por las bibliotecas refactorizadas equivalentes. Para más información sobre las bibliotecas concretas que se van a usar, vea Características de la biblioteca CRT.

Implementación y redistribución de CRT universal

Dado que UCRT es ahora un componente del sistema operativo Microsoft Windows, se incluye como parte del sistema operativo en Windows 10 y versiones posteriores. Está disponible a través de Windows Update para sistemas operativos anteriores, Windows Vista a través de Windows 8.1. Hay una versión Redistributable disponible para Windows XP. Como componente del sistema operativo, Windows Update administra las actualizaciones y el mantenimiento de UCRT independientemente de las versiones de Visual Studio y el Compilador de Microsoft Visual C++. Puesto que UCRT es un componente de Windows, por motivos de seguridad y de facilidad de las actualizaciones, así como por el menor tamaño de imagen, se recomienda encarecidamente el uso del paquete Redistributable para la implementación central de UCRT para la aplicación.

Se puede usar el UCRT en cualquier versión de Windows compatible con Visual Studio 2015 o posteriores. Puede redistribuirlo mediante un paquete vcredist para las versiones admitidas de Windows previas a Windows 10. Los paquetes vcredist incluyen los componentes de UCRT y los instalan de manera automática en los sistemas operativos Windows que no los tienen instalados de forma predeterminada. Para obtener más información, consulte Redistribuir archivos de Visual C++.

Se admite la implementación local de aplicación de UCRT, aunque no se recomienda por motivos de rendimiento y seguridad. Los archivos DLL para la implementación local de aplicación se incluyen como parte de Windows SDK, en el subdirectorio redist. Los archivos DLL necesarios incluyen ucrtbase.dll y un conjunto de DLL de reenviador APISetdenominado api-ms-win-[subset].dll. El conjunto de archivos DLL necesario en cada sistema operativo varía, por lo que se recomienda incluir todos los archivos DLL cuando se use la implementación local de aplicación. Para obtener más información y recomendaciones sobre la implementación local de la aplicación, vea Implementación en Visual C++.

Cambios en las funciones y macros de CRT universal

En UCRT se han agregado o actualizado muchas funciones para mejorar la conformidad con ISO C99 y para resolver problemas de calidad y seguridad del código. En algunos casos, esto ha exigido cambios importantes en la biblioteca. El código que se compiló de forma correcta al usar una versión anterior de CRT puede interrumpirse al compilarlo mediante UCRT. Si es así, debe cambiar el código para aprovechar las actualizaciones y características de UCRT. Para obtener una lista detallada de los cambios y actualizaciones importantes en CRT realizados en CRT universal, vea la sección Biblioteca de C en tiempo de ejecución (CRT) del historial de cambios de Visual C++. Incluye una lista de encabezados afectados y funciones que puede usar para identificar los cambios necesarios en el código.

Consulte también

Guía de migración y actualización de Visual C++
Información general sobre posibles problemas de actualización (Visual C++)
Actualización de proyectos de C++ desde versiones anteriores de Visual Studio
Historial de cambios en Visual C++ 2003-2015
Mejoras de conformidad de C++ en Visual Studio