Delen via


Binaire C++-compatibiliteit tussen Visual Studio-versies

De microsoft C++-compilerhulpprogramma's (MSVC) in Visual Studio 2013 en eerder garanderen geen binaire compatibiliteit tussen primaire versies. U kunt geen objectbestanden, statische bibliotheken, dynamische bibliotheken en uitvoerbare bestanden koppelen die zijn gebouwd door verschillende versies van deze hulpprogrammasets. De ABI's, objectindelingen en runtimebibliotheken zijn niet compatibel.

Dit gedrag is gewijzigd in Visual Studio 2015 en latere versies. De runtimebibliotheken en apps die door een van deze versies van de compiler zijn gecompileerd, zijn binair compatibel. Dit wordt weerspiegeld in het hoofdnummer van de C++-toolset, dat begint met 14 voor alle versies sinds Visual Studio 2015. (De toolsetversie is v140 voor Visual Studio 2015, v141 voor 2017, v142 voor 2019 en v143 voor 2022). Stel dat u bibliotheken van derden hebt gebouwd door Visual Studio 2015. U kunt deze nog steeds gebruiken in een toepassing die is gebouwd door Visual Studio 2017, 2019 of 2022. U hoeft niet opnieuw te compileren met een overeenkomende toolset. De nieuwste versie van het Microsoft Visual C++ Redistributable-pakket (redistributable) werkt voor alle versies.

Beperkingen voor binaire compatibiliteit

Er zijn drie belangrijke beperkingen voor binaire compatibiliteit tussen de v140-, v141-, v142- en v143-toolsets en secundaire genummerde versie-updates:

  • Binaire bestanden die zijn gemaakt met verschillende versies van de hulpprogramma's v140, v141, v142 en v143 kunnen worden gecombineerd. De belangrijkste regel is dat de linker alleen mag werken met invoer die is gebouwd door een toolset die dezelfde versie (of eerder) is als zichzelf. Dit is van toepassing op apps, importbibliotheken, statische bibliotheken en andere bestanden, zoals beschreven in LINK-invoerbestanden. In sommige gevallen kan een importbibliotheek voor een impliciet gekoppelde DLL die is gebouwd door een latere versie van de toolset worden gekoppeld met behulp van een eerdere versie van de toolset, met name als de importbibliotheek strikt gebruikmaakt van extern "C" voor de import/exports. Hier volgen enkele voorbeelden van wat dit allemaal betekent:
    • Een app die is gecompileerd met een 2017-toolset (v141, versie 15.0 tot en met 15.9) kan worden gekoppeld aan een statische bibliotheek die is gecompileerd met Visual Studio 2022 versie 17.8 (v143), maar de koppeling moet worden uitgevoerd met behulp van een hulpprogrammaset van versie 17.8 of hoger.
    • Apps en bibliotheken die zijn gebouwd met VS 2015, 2017, 2019 of 2022, kunnen worden gekoppeld, maar de koppeling moet worden uitgevoerd met behulp van een versie van de toolset die net zo recent is als, of meer recent dan, de meest recente toolset die wordt gebruikt om een van de binaire bestanden te bouwen die u doorgeeft aan de linker. Als u bijvoorbeeld drie binaire bestanden hebt gemaakt met toolsets van VS 2015 versie 14.3, VS 2017 versie 15.9 en VS 2019 versie 16.11, kunt u deze koppelen met behulp van elke toolsetversie die 16.11 of hoger is.
    • Als een DLL is gebouwd met een nieuwere toolset, kan de importbibliotheek soms worden gebruikt met oudere toolsets als alle exports voldoen aan de C-taalconventie (extern "C"). De enige officieel ondersteunde case is echter het gebruik van een nieuwere Windows SDK met een oudere toolset.
  • Het redistributable dat uw app gebruikt, heeft een vergelijkbare beperking voor binaire compatibiliteit. Wanneer u binaire bestanden combineert die zijn gebouwd door verschillende ondersteunde versies van de toolset, moet de herdistribueerbare versie ten minste zo nieuw zijn als de meest recente toolset die door elk app-onderdeel wordt gebruikt.
  • Statische bibliotheken of objectbestanden die zijn gecompileerd met behulp van de /GL (Hele programmaoptimalisatie) compilerswitch of gekoppeld met behulp van /LTCG (generatie koppelingstijdcode)niet binaire compatibele versies, waaronder secundaire versie-updates. Alle objectbestanden en -bibliotheken die zijn gecompileerd met behulp van /GL en /LTCG moeten exact dezelfde toolset gebruiken voor het compileren en de uiteindelijke koppeling. Code die is gebouwd met behulp van /GL in de visual Studio 2019 versie 16.7-toolset, kan bijvoorbeeld niet worden gekoppeld aan code die is gebouwd met behulp van /GL in de toolset visual Studio 2019 versie 16.8. De compiler geeft Fatale fout C1047.

Microsoft Visual C++ Redistributable upgraden vanuit Visual Studio 2015 en hoger

We hebben het primaire versienummer van Microsoft Visual C++ Redistributable bewaard voor Visual Studio 2015, 2017, 2019 en 2022. Dat betekent dat slechts één exemplaar van redistributable tegelijk kan worden geïnstalleerd. Een nieuwere versie overschrijft alle oudere versies die al zijn geïnstalleerd. Eén app kan bijvoorbeeld redistributable installeren vanuit Visual Studio 2015. Vervolgens installeert een andere app redistributable vanuit Visual Studio 2022. De 2022-versie overschrijft de oudere versie, maar omdat ze binair compatibel zijn, werkt de eerdere app nog steeds prima. We zorgen ervoor dat de nieuwste versie van Redistributable alle nieuwste functies, beveiligingsupdates en oplossingen voor fouten bevat. Daarom raden we u altijd aan een upgrade uit te voeren naar de nieuwste beschikbare versie.

U kunt ook geen oudere Versie van Redistributable installeren wanneer er al een nieuwere versie is geïnstalleerd. Het installatieprogramma meldt een fout als u het probeert. Er wordt een dergelijke fout weergegeven als u het herdistribueerbare 2017 of 2019 installeert op een computer met de 2022-versie:

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.

Deze fout is standaard. U wordt aangeraden de nieuwste versie geïnstalleerd te houden. Zorg ervoor dat uw installatieprogramma geruisloos van deze fout kan herstellen.

Belangrijk

Runtimebibliotheekondersteuning voor Windows XP is niet meer beschikbaar in de nieuwste Versie van Visual C++ Redistributable voor Visual Studio. De laatste herdistribueerbaar voor ondersteuning van Windows XP is versie 16.7 (bestandsversie 14.27.29114.0). Als uw Windows XP-apps worden geïmplementeerd met of bijgewerkt naar een latere versie van het herdistribueerbare, worden de apps niet uitgevoerd. Zie Programma's configureren voor Windows XPvoor meer informatie en hoe u een versie van de herdistribueerbare versie kunt krijgen die Ondersteuning biedt voor Windows XP.

Zie ook

Visual C++ Wijzigingsgeschiedenis
De meest recente ondersteunde downloads van Visual C++ Redistributable
Het gebruik van visual C++ Runtime-versies controleren
Veelgestelde vragen over de levenscyclus - Visual C++ Redistributable en runtimebibliotheken