Dela via


C++-binär kompatibilitet mellan Visual Studio-versioner

Kompilatorverktygen för Microsoft C++ (MSVC) i Visual Studio 2013 och tidigare garanterar inte binär kompatibilitet mellan större versioner. Du kan inte länka objektfiler, statiska bibliotek, dynamiska bibliotek och körbara filer som skapats av olika versioner av dessa verktygsuppsättningar. ABI:er, objektformat och körningsbibliotek är inte kompatibla.

Vi har ändrat det här beteendet i Visual Studio 2015 och senare versioner. Körningsbiblioteken och apparna som kompileras av någon av dessa versioner av kompilatorn är binärkompatibla. Det återspeglas i huvudnumret för C++-verktygsuppsättningen, som börjar med 14 för alla versioner sedan Visual Studio 2015. (Verktygsuppsättningsversionen är v140 för Visual Studio 2015, v141 för 2017, v142 för 2019 och v143 för 2022). Anta att du har bibliotek från tredje part som skapats av Visual Studio 2015. Du kan fortfarande använda dem i ett program som skapats av Visual Studio 2017, 2019 eller 2022. Du behöver inte kompilera om med en matchande verktygsuppsättning. Den senaste versionen av Microsoft Visual C++ Redistributable-paketet (redistributable) fungerar för alla.

Begränsningar för binär kompatibilitet

Det finns tre viktiga begränsningar för binär kompatibilitet mellan verktygsuppsättningarna v140, v141, v142 och v143 och mindre numrerade versionsuppdateringar:

  • Binärfiler som skapats med olika versioner av verktygsuppsättningarna v140, v141, v142 och v143 kan kombineras. Nyckelregeln är att länkaren endast ska fungera med indata som skapats av en verktygsuppsättning som är samma version (eller tidigare) som sig själv. Detta gäller för appar, importbibliotek, statiska bibliotek och andra filer enligt beskrivningen i LINK-indatafiler. I vissa fall kan ett importbibliotek för en implicit länkad DLL som skapats av en senare version av verktygsuppsättningen länkas med hjälp av en tidigare version av verktygsuppsättningen – särskilt om importbiblioteket strikt använder extern "C" för import/export. Här följer några exempel på vad allt detta innebär:
    • En app som kompilerats med en 2017-verktygsuppsättning (v141, version 15.0 till 15.9) kan länkas till ett statiskt bibliotek som kompilerats med Visual Studio 2022 version 17.8 (v143), men länkningen måste göras med hjälp av en version 17.8 eller senare.
    • Appar och bibliotek som skapats med VS 2015, 2017, 2019 eller 2022 kan länkas samman, men länken måste göras med hjälp av en version av verktygsuppsättningen som är så ny som eller senare än den senaste verktygsuppsättningen som används för att skapa någon av de binärfiler som du skickar till länkaren. Med tanke på tre binärfiler som skapats med verktygsuppsättningar från VS 2015 version 14.3, VS 2017 version 15.9 och VS 2019 version 16.11 kan du länka dem med valfri verktygsuppsättningsversion som är 16.11 eller senare.
    • Om en DLL skapas med en nyare verktygsuppsättning kan importbiblioteket ibland användas med äldre verktygsuppsättningar om alla exporter följer C-språkanropskonventionen (extern "C"). Det enda fall som stöds officiellt är dock att använda en nyare Windows SDK med en äldre verktygsuppsättning.
  • Den redistributable som appen använder har en liknande begränsning för binär kompatibilitet. När du blandar binärfiler som skapats av olika versioner av verktygsuppsättningen som stöds måste den omdistribuerbara versionen vara minst lika ny som den senaste verktygsuppsättningen som används av en appkomponent.
  • Statiska bibliotek eller objektfiler som kompilerats med hjälp av /GL (helprogramoptimering) kompilatorväxeln eller kopplats med /LTCG (länktidskodgenerering)är inte binärkompatibla mellan versioner, inklusive delversionsuppdateringar. Alla objektfiler och bibliotek som kompilerats med hjälp av /GL och /LTCG måste använda exakt samma verktygsuppsättning för kompilering och den slutliga länken. Kod som skapas med hjälp av /GL i Visual Studio 2019 version 16.7-verktygsuppsättningen kan till exempel inte länkas till kod som skapats med hjälp av /GL i Visual Studio 2019 version 16.8-verktygsuppsättningen. Kompilatorn genererar allvarligt fel C1047.

Uppgradera Microsoft Visual C++ Redistributable från Visual Studio 2015 och senare

Vi har hållit microsoft Visual C++ Redistributables huvudversionsnummer på samma sätt för Visual Studio 2015, 2017, 2019 och 2022. Det innebär att endast en instans av Redistributable kan installeras i taget. En nyare version skriver över alla äldre versioner som redan har installerats. En app kan till exempel installera Redistributable från Visual Studio 2015. Sedan installerar en annan app Redistributable från Visual Studio 2022. 2022-versionen skriver över den äldre versionen, men eftersom de är binärkompatibla fungerar den tidigare appen fortfarande bra. Vi ser till att den senaste versionen av Redistributable har alla de senaste funktionerna, säkerhetsuppdateringarna och felkorrigeringarna. Därför rekommenderar vi alltid att du uppgraderar till den senaste tillgängliga versionen.

På samma sätt kan du inte installera en äldre Redistributable när en nyare version redan är installerad. Installationsprogrammet rapporterar ett fel om du försöker. Ett felmeddelande visas om du installerar 2017 eller 2019 Redistributable på en dator som redan har 2022-versionen:

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.

Det här felet är avsiktligt. Vi rekommenderar att du behåller den senaste versionen installerad. Se till att installationsprogrammet kan återhämta sig från det här felet utan att användaren märker det.

Viktig

Stöd för körtidsbibliotek för Windows XP är inte längre tillgängligt i det senaste Visual C++-omdistribuerbara paketet för Visual Studio. Den sista omdistribuerbara versionen för Windows XP är version 16.7 (filversion 14.27.29114.0). Om dina Windows XP-appar distribueras med eller uppdateras till en senare version av den omdistribuerbara versionen körs inte apparna. Mer information och hur du hämtar en version av den omdistribuerbara versionen som stöder Windows XP finns i Konfigurera program för Windows XP.

Se även

Visual C++ ändringshistorik
De senast stödda Visual C++ Redistributable-nedladdningarna
Så här granskar du användning av Visual C++ Runtime-version
FAQ om livscykel: Visual C++ Redistributable och körningsbibliotek