Compatibilité binaire C++ entre les versions de Visual Studio

Les ensembles d’outils du compilateur Microsoft C++ (MSVC) dans Visual Studio 2013 et versions antérieures ne garantissent pas la compatibilité binaire entre les versions principales. Vous ne pouvez pas lier des fichiers objet, des bibliothèques statiques, des bibliothèques dynamiques et des exécutables créés par différentes versions de ces ensembles d’outils. Les API, les formats d’objet et les bibliothèques runtime sont incompatibles.

Nous avons modifié ce comportement dans Visual Studio 2015 et versions ultérieures. Les bibliothèques et applications runtime compilées par l’une de ces versions du compilateur sont compatibles binaires. Elle est reflétée dans le numéro principal de l’ensemble d’outils C++, qui commence par 14 pour toutes les versions depuis Visual Studio 2015. (La version de l’ensemble d’outils est v140 pour Visual Studio 2015, v141 pour 2017, v142 pour 2019 et v143 pour 2022). Supposons que vous disposez de bibliothèques tierces créées par Visual Studio 2015. Vous pouvez toujours les utiliser dans une application générée par Visual Studio 2017, 2019 ou 2022. Il n’est pas nécessaire de recompiler avec un ensemble d’outils correspondant. La dernière version du package Redistribuable Microsoft Visual C++ (redistribuable) fonctionne pour tous ces derniers.

Restrictions sur la compatibilité binaire

Il existe trois restrictions importantes sur la compatibilité binaire entre les ensembles d’outils v140, v141, v142 et v143 et les mises à jour de version numérotée mineure :

  • Les fichiers binaires créés avec différentes versions des ensembles d’outils v140, v141, v142 et v143 peuvent être combinés. La règle de clé est que l’éditeur de liens ne doit fonctionner qu’avec les entrées générées par un ensemble d’outils qui est la même version (ou une version antérieure) que lui-même. Cela s’applique aux applications, aux bibliothèques d’importation, aux bibliothèques statiques et à d’autres fichiers, comme décrit dans les fichiers d’entrée LINK. Dans certains cas, une bibliothèque d’importation pour une DLL implicitement liée créée par une version ultérieure de l’ensemble d’outils peut être liée à l’aide d’une version antérieure de l’ensemble d’outils, en particulier si la bibliothèque d’importation utilise extern "C" strictement les importations/exportations. Voici quelques exemples de ce que cela signifie :
    • Une application compilée avec un ensemble d’outils 2017 (v141, versions 15.0 à 15.9) peut être liée à une bibliothèque statique compilée avec Visual Studio 2022 version 17.8 (v143), mais la liaison doit être effectuée à l’aide d’un ensemble d’outils version 17.8 ou ultérieure.
    • Les applications et bibliothèques créées à l’aide de VS 2015, 2017, 2019 ou 2022 peuvent être liées ensemble, mais la liaison doit être effectuée à l’aide d’une version de l’ensemble d’outils qui est aussi récent que, ou plus récent, que l’ensemble d’outils le plus récent utilisé pour générer l’un des fichiers binaires que vous passez à l’éditeur de liens. Par exemple, étant donné trois fichiers binaires créés avec des ensembles d’outils de VS 2015 version 14.3, VS 2017 version 15.9 et VS 2019 version 16.11, vous pouvez les lier à l’aide de n’importe quelle version d’ensemble d’outils qui est 16.11 ou ultérieure.
    • Si une DLL est générée avec un ensemble d’outils plus récent, la bibliothèque d’importation peut parfois être utilisée avec des ensembles d’outils plus anciens si toutes les exportations suivent la convention d’appel de langue C (extern "C"). Toutefois, le seul cas officiellement pris en charge consomme un sdk Windows plus récent avec un ensemble d’outils plus ancien.
  • Le redistribuable que votre application utilise a une restriction de compatibilité binaire similaire. Lorsque vous mélangez des fichiers binaires générés par différentes versions prises en charge de l’ensemble d’outils, la version redistribuable doit être au moins aussi nouvelle que l’ensemble d’outils le plus récent utilisé par n’importe quel composant d’application.
  • Les bibliothèques statiques ou les fichiers objet compilés à l’aide du commutateur du compilateur (optimisation du programme Qui le) ou liés à l’aide /LTCG/GL de la (génération de code au moment du lien) ne sont pas compatibles binaires entre les versions, y compris les mises à jour de version mineures. Tous les fichiers et bibliothèques d’objets compilés à l’aide /GL du /LTCG même ensemble d’outils doivent utiliser exactement le même ensemble d’outils pour la compilation et le lien final. Par exemple, le code généré à l’aide /GL de l’ensemble d’outils Visual Studio 2019 version 16.7 ne peut pas être lié au code généré à l’aide /GL de l’ensemble d’outils Visual Studio 2019 version 16.8. Le compilateur émet une erreur irrécupérable C1047.

Mettre à niveau le redistribuable Microsoft Visual C++ à partir de Visual Studio 2015 et versions ultérieures

Nous avons conservé le numéro de version principale redistribuable Microsoft Visual C++ identique pour Visual Studio 2015, 2017, 2019 et 2022. Cela signifie qu’une seule instance de Redistributable peut être installée à la fois. Une version plus récente remplace toute version antérieure déjà installée. Par exemple, une application peut installer redistribuable à partir de Visual Studio 2015. Ensuite, une autre application installe redistribuable à partir de Visual Studio 2022. La version 2022 remplace l’ancienne version, mais parce qu’elle est compatible binaire, l’application précédente fonctionne toujours correctement. Nous nous assurons que la dernière version du Redistributable dispose de toutes les fonctionnalités, mises à jour de sécurité et correctifs de bogues les plus récents. C’est pourquoi nous vous recommandons toujours de procéder à la mise à niveau vers la dernière version disponible.

De même, vous ne pouvez pas installer un redistribuable plus ancien lorsqu’une version plus récente est déjà installée. Le programme d’installation signale une erreur si vous essayez. Une erreur semblable à celle-ci s’affiche si vous installez le redistribuable 2017 ou 2019 sur un ordinateur qui dispose déjà de la version 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.

Cette erreur est par conception. Nous vous recommandons de conserver la version la plus récente installée. Assurez-vous que votre programme d’installation peut récupérer à partir de cette erreur en mode silencieux.

Important

La prise en charge de la bibliothèque runtime pour Windows XP n’est plus disponible dans la dernière Redistributable Visual C++ pour Visual Studio. Le dernier redistribuable pour prendre en charge Windows XP est la version 16.7 (version de fichier 14.27.29114.0). Si vos applications Windows XP sont déployées avec ou mises à jour vers une version ultérieure du redistribuable, les applications ne s’exécutent pas. Pour plus d’informations et comment obtenir une version du redistribuable qui prend en charge Windows XP, consultez Configuration des programmes pour Windows XP.

Voir aussi

Historique des modifications de Visual C++
Les derniers téléchargements Redistribuables Visual C++ pris en charge