Compatibilità binaria C++ tra le versioni di Visual Studio

I set di strumenti del compilatore Microsoft C++ (MSVC) in Visual Studio 2013 e versioni precedenti non garantiscono la compatibilità binaria tra le versioni principali. Non è possibile collegare file oggetto, librerie statiche, librerie dinamiche ed eseguibili creati da versioni diverse di questi set di strumenti. Le librerie ABI, oggetti e runtime non sono compatibili.

Questo comportamento è stato modificato in Visual Studio 2015 e versioni successive. Le librerie di runtime e le app compilate da una di queste versioni del compilatore sono compatibili con i file binari. Si riflette nel numero principale del set di strumenti C++, che inizia con 14 per tutte le versioni a partire da Visual Studio 2015. La versione del set di strumenti è v140 per Visual Studio 2015, v141 per 2017, v142 per 2019 e v143 per 2022. Si supponga di avere librerie di terze parti create da Visual Studio 2015. È comunque possibile usarli in un'applicazione compilata da Visual Studio 2017, 2019 o 2022. Non è necessario ricompilare con un set di strumenti corrispondente. La versione più recente del pacchetto Ridistribuibile di Microsoft Visual C++ (Redistributable) funziona per tutte.

Restrizioni sulla compatibilità binaria

Esistono tre importanti restrizioni sulla compatibilità binaria tra i set di strumenti v140, v141, v142 e v143 e gli aggiornamenti della versione secondaria numerati:

  • I file binari creati con versioni diverse dei set di strumenti v140, v141, v142 e v143 possono essere combinati. La regola chiave è che il linker deve funzionare solo con gli input creati da un set di strumenti che corrisponde alla stessa versione (o precedente) di se stessa. Questo vale per le app, importare librerie, librerie statiche e altri file, come descritto in LINK input files .This applies to apps, import libraries, static libraries, and other files as described in LINK input files. In alcuni casi, una libreria di importazione per una DLL collegata implicitamente compilata da una versione successiva del set di strumenti può essere collegata usando una versione precedente del set di strumenti, soprattutto se la libreria di importazione usa extern "C" rigorosamente per le importazioni/esportazioni. Ecco alcuni esempi di ciò che significa tutto questo:
    • Un'app compilata con un set di strumenti 2017 (versione 141, da 15.0 a 15.9) può essere collegata a una libreria statica compilata con Visual Studio 2022 versione 17.8 (v143), ma il collegamento deve essere eseguito usando un set di strumenti versione 17.8 o successiva.
    • Le app e le librerie compilate con VS 2015, 2017, 2019 o 2022 possono essere collegate tra loro, ma il collegamento deve essere eseguito usando una versione del set di strumenti recente come, o più recente, il set di strumenti più recente usato per compilare uno dei file binari passati al linker. Ad esempio, dato tre file binari compilati con set di strumenti di VS 2015 versione 14.3, VS 2017 versione 15.9 e VS 2019 versione 16.11, è possibile collegarli usando qualsiasi versione del set di strumenti 16.11 o successiva.
    • Se una DLL viene compilata con un set di strumenti più recente, la libreria di importazione può talvolta essere usata con set di strumenti meno recenti se tutte le esportazioni seguono la convenzione di chiamata del linguaggio C (extern "C"). Tuttavia, l'unico caso ufficialmente supportato sta usando un SDK di Windows più recente con un set di strumenti meno recente.
  • L'app Ridistribuibile usata ha una restrizione di compatibilità binaria simile. Quando si combinano file binari compilati da versioni supportate diverse del set di strumenti, la versione Redistributable deve essere almeno nuova come il set di strumenti più recente usato da qualsiasi componente dell'app.
  • Le librerie statiche o i file oggetto compilati usando l'opzione del /GL compilatore (Ottimizzazione programma intero) o collegate tramite /LTCG (generazione di codice in fase di collegamento) non sono compatibili con file binari tra versioni diverse, inclusi gli aggiornamenti delle versioni secondarie. Tutti i file oggetto e le librerie compilati usando /GL e /LTCG devono usare esattamente lo stesso set di strumenti per la compilazione e il collegamento finale. Ad esempio, il codice compilato usando /GL nel set di strumenti di Visual Studio 2019 versione 16.7 non può essere collegato al codice compilato usando /GL nel set di strumenti di Visual Studio 2019 versione 16.8. Il compilatore genera l'errore irreversibile C1047.

Aggiornare Microsoft Visual C++ Redistributable da Visual Studio 2015 e versioni successive

Microsoft Visual C++ Redistributable ha mantenuto lo stesso numero di versione principale per Visual Studio 2015, 2017, 2019 e 2022. Ciò significa che è possibile installare una sola istanza di Redistributable alla volta. Una versione più recente sovrascrive qualsiasi versione precedente già installata. Ad esempio, un'app può installare Redistributable da Visual Studio 2015. Un'altra app installa quindi Redistributable da Visual Studio 2022. La versione 2022 sovrascrive la versione precedente, ma poiché sono compatibili con i file binari, l'app precedente funziona ancora correttamente. Assicurarsi che la versione più recente di Redistributable abbia tutte le funzionalità più recenti, gli aggiornamenti della sicurezza e le correzioni di bug. Ecco perché è sempre consigliabile eseguire l'aggiornamento alla versione più recente disponibile.

Analogamente, non è possibile installare una versione ridistribuibile precedente quando è già installata una versione più recente. Se si prova, il programma di installazione segnala un errore. Se si installa 2017 o 2019 Redistributable in un computer che dispone già della versione 2022, verrà visualizzato un errore simile al seguente:

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.

Questo errore è in base alla progettazione. È consigliabile mantenere installata la versione più recente. Assicurarsi che il programma di installazione possa essere ripristinato automaticamente da questo errore.

Importante

Il supporto della libreria di runtime per Windows XP non è più disponibile nella Visual C++ Redistributable per Visual Studio più recente. L'ultimo ridistribuibile per supportare Windows XP è la versione 16.7 (file versione 14.27.29114.0). Se le app di Windows XP vengono distribuite o aggiornate a una versione successiva della ridistribuibile, le app non verranno eseguite. Per altre informazioni e come ottenere una versione del ridistribuibile che supporta Windows XP, vedere Configurazione di programmi per Windows XP.

Vedi anche

Cronologia delle modifiche di Visual C++
Download più recenti supportati di Visual C++ Redistributable