Compatibilidad binaria de C++ entre versiones de Visual Studio

Los conjuntos de herramientas del compilador de Microsoft C++ (MSVC) en Visual Studio 2013 y versiones anteriores no garantizan compatibilidad binaria en las versiones principales. No se pueden vincular archivos objeto, bibliotecas estáticas, bibliotecas dinámicas y ejecutables creados mediante diferentes versiones de estos conjuntos de herramientas. Las API, los formatos de objeto y las bibliotecas en tiempo de ejecución son incompatibles.

Este comportamiento lo hemos cambiado en Visual Studio 2015 y versiones posteriores. Las bibliotecas y aplicaciones en tiempo de ejecución compiladas mediante cualquiera de estas versiones del compilador son compatibles con binarios. Se refleja en el número principal del conjunto de herramientas de C++, que comienza por 14 para todas las versiones desde Visual Studio 2015. (La versión del conjunto de herramientas es v140 para Visual Studio 2015, v141 para 2017, v142 para 2019 y v143 para 2022). Supongamos que tiene bibliotecas de terceros que ha compilado Visual Studio 2015. Todavía puede usarlos en una aplicación que haya compilado Visual Studio 2017, 2019 o 2022. No es necesario volver a compilar con un conjunto de herramientas coincidente. La versión más reciente del paquete de Microsoft Visual C++ Redistributable (el redistribuible) funciona para todos ellos.

Restricciones de compatibilidad binaria

Hay tres restricciones importantes sobre la compatibilidad binaria entre los conjuntos de herramientas v140, v141, v142 y v143, y las actualizaciones secundarias de versión numerada:

  • Los archivos binarios creados con diferentes versiones de los conjuntos de herramientas v140, v141, v142 y v143 se pueden combinar. La regla de clave es que el enlazador solo debe trabajar con entradas compiladas por un conjunto de herramientas que sea la misma versión (o anterior) que sí mismo. Esto se aplica a las aplicaciones, importar bibliotecas, bibliotecas estáticas y otros archivos, tal como se describe en Archivos de entrada LINK. En algunos casos, una biblioteca de importación para un archivo DLL vinculado implícitamente creado por una versión posterior del conjunto de herramientas se puede vincular mediante una versión anterior del conjunto de herramientas, especialmente si la biblioteca de importación usa extern "C" estrictamente para las importaciones o exportaciones. Estos son algunos ejemplos de lo que significa todo esto:
    • Una aplicación compilada con un conjunto de herramientas de 2017 (v141, versiones 15.0 a 15.9) se puede vincular a una biblioteca estática compilada con Visual Studio 2022 versión 17.8 (v143), pero la vinculación debe realizarse con una versión 17.8 o un conjunto de herramientas posterior.
    • Las aplicaciones y bibliotecas compiladas con VS 2015, 2017, 2019 o 2022 se pueden vincular juntas, pero la vinculación debe realizarse con una versión del conjunto de herramientas que sea tan reciente como, o más reciente que, el conjunto de herramientas más reciente usado para compilar cualquiera de los archivos binarios que pase al enlazador. Por ejemplo, dados tres archivos binarios creados con conjuntos de herramientas de VS 2015 versión 14.3, VS 2017 versión 15.9 y VS 2019 versión 16.11, puede vincularlos mediante cualquier versión del conjunto de herramientas que sea 16.11 o posterior.
    • Si un archivo DLL se compila con un conjunto de herramientas más reciente, la biblioteca de importación a veces se puede usar con conjuntos de herramientas anteriores si todas las exportaciones siguen la convención de llamada del lenguaje C (extern "C"). Sin embargo, el único caso admitido oficialmente es consumir un SDK de Windows más reciente con un conjunto de herramientas anterior.
  • El redistribuible que usa la aplicación tiene una restricción de compatibilidad binaria similar. Al mezclar archivos binarios que hayan compilado diferentes versiones compatibles del conjunto de herramientas, la versión redistribuible debe ser al menos tan nueva como el conjunto de herramientas más reciente que haya usado cualquier componente de la aplicación.
  • Las bibliotecas estáticas o los archivos objeto compilados mediante el modificador del compilador /GL (optimización de todo el programa) o vinculados mediante /LTCG (generación de código en tiempo de vínculo)no son compatibles con binarios entre versiones, incluidas las actualizaciones de versiones secundarias. Todos los archivos y bibliotecas de objetos compilados con /GL y /LTCG deben usar exactamente el mismo conjunto de herramientas para la compilación y el vínculo final. Por ejemplo, el código compilado con /GL en el conjunto de herramientas de Visual Studio 2019, versión 16.7, no se puede vincular al código compilado mediante /GL en el conjunto de herramientas de Visual Studio 2019, versión 16.8. El compilador emite un error irrecuperable C1047.

Actualización de Microsoft Visual C++ Redistributable desde Visual Studio 2015 y versiones posteriores

Hemos mantenido el número de versión principal de Microsoft Visual C++ Redistributable igual para Visual Studio 2015, 2017, 2019 y 2022. Esto significa que solo se puede instalar una instancia del redistribuible a la vez. Una versión más reciente sobrescribe cualquier versión anterior que ya esté instalada. Por ejemplo, una aplicación puede instalar el redistribuible desde Visual Studio 2015. Después, otra aplicación instala el redistribuible desde Visual Studio 2022. La versión 2022 sobrescribe la versión anterior pero, dado que son compatibles con binarios, la aplicación anterior sigue funcionando correctamente. Nos aseguramos de que la versión más reciente del redistribuible tenga todas las características, actualizaciones de seguridad y correcciones de errores más recientes. Por este motivo siempre se recomienda actualizar a la versión más reciente disponible.

Del mismo modo, no se puede instalar un redistribuible anterior cuando ya está instalada una versión más reciente. Si lo intenta, el instalador notificará un error. Verá un error similar al siguiente si instala el redistribuible 2017 o 2019 en un equipo que ya tenga la versión 2022:

0x80070666 - Another version of this product is already installed. Installation of this version cannot continue. To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel.

Se trata de un error por diseño. Se recomienda mantener instalada la versión más reciente. Asegúrese de que el instalador puede recuperarse de este error de forma silenciosa.

Importante

La compatibilidad de la biblioteca en tiempo de ejecución con Windows XP ya no está disponible en la versión más reciente de Visual C++ Redistributable para Visual Studio. El último archivo redistribuible que admite Windows XP es la versión 16.7 (archivo versión 14.27.29114.0). Si las aplicaciones de Windows XP se implementan o se actualizan a una versión posterior del objeto redistribuible, no se ejecutarán. Para obtener más información y saber cómo obtener una versión del archivo redistribuible que admite Windows XP, consulte Configuración de programas para Windows XP.

Consulte también

Historial de cambios en Visual C++
Las últimas descargas de Visual C++ Redistributable compatibles