Sdílet prostřednictvím


Binární kompatibilita jazyka C++ mezi verzemi sady Visual Studio

Nástroje sestavení Microsoft C++ (MSVC) v sadě Visual Studio 2013 a dřívějších verzích nezaručují binární kompatibilitu mezi hlavními verzemi. Nelze propojit soubory objektů, statické knihovny, dynamické knihovny a spustitelné soubory vytvořené různými verzemi těchto nástrojů sestavení. Rozhraní ABI, formáty objektů a knihovny modulu runtime nejsou kompatibilní.

Toto chování jsme změnili v sadě Visual Studio 2015 a novějších verzích. Knihovny modulu runtime a aplikace kompilované některou z těchto verzí kompilátoru jsou binární kompatibilní. Odráží se v hlavním čísle nástroje sestavení MSVC, které začíná číslem 14 pro všechny verze od sady Visual Studio 2015. (Verze nástrojů sestavení je v140 pro Visual Studio 2015, v141 pro 2017, v142 pro 2019 a v143 pro 2022). Řekněme, že máte knihovny třetích stran vytvořené sadou Visual Studio 2015. Můžete je dál používat v aplikaci vytvořené sadou Visual Studio 2017, 2019, 2022 nebo 2026. Není nutné překompilovat s odpovídající verzí. Nejnovější verze distribuovatelného balíčku Microsoft Visual C++ (Redistributable) funguje pro všechny z nich.

Omezení binární kompatibility

Existují tři důležitá omezení binární kompatibility mezi nástroji pro sestavení v140, v141, v142, v143 a v145 a aktualizacemi podverze:

  • Binární soubory vytvořené s různými verzemi nástrojů sestavení v140, v141, v142, v143 a v145 je možné kombinovat. Klíčové pravidlo je, že linker by měl pracovat pouze se vstupy sestavenými buildovacími nástroji, které jsou stejné verze (nebo starší) jako sám linker. To platí pro aplikace, import knihoven, statické knihovny a další soubory, jak je popsáno ve vstupních souborech LINK. V některých případech lze knihovnu importu pro implicitně propojenou knihovnu DLL vytvořenou novější verzí nástrojů sestavení propojit pomocí starší verze nástrojů sestavení – zejména pokud knihovna importu výhradně používá extern "C" pro importy a exporty. Tady je několik příkladů, co to znamená:
    • Aplikace zkompilovaná pomocí nástrojů sestavení 2017 (verze 141 verze 15.0 až 15.9) je možné propojit se statickou knihovnou zkompilovanou pomocí sady Visual Studio 2022 verze 17.8 (v143), ale propojení musí být provedeno pomocí nástrojů sestavení verze 17.8 nebo novější.
    • Aplikace a knihovny vytvořené pomocí sady VS 2015, 2017, 2019, 2022 a 2026 se dají propojit společně, ale propojení se musí provést pomocí verze nástrojů sestavení, které jsou nejnovější nebo novější než nejnovější nástroje sestavení použité k sestavení libovolného binárního souboru, který předáte linkeru. Například vzhledem k třem binárním souborům vytvořeným pomocí nástrojů sestavení z VS 2015 verze 14.3, VS 2017 verze 15.9 a VS 2019 verze 16.11 je můžete propojit pomocí libovolné verze nástrojů sestavení, která je 16.11 nebo novější.
    • Pokud je knihovna DLL sestavená s novějšími nástroji sestavení, je možné knihovnu importu někdy použít se staršími nástroji sestavení, pokud všechny exporty dodržují konvenci volání jazyka C (extern "C"). Jediný oficiálně podporovaný případ ale využívá novější sadu Windows SDK se staršími nástroji pro sestavení.
  • Redistribuovatelné použití aplikace má podobné omezení binární kompatibility. Při kombinování binárních souborů vytvořených různými podporovanými verzemi nástrojů sestavení musí být redistribuovatelná verze minimálně stejně nová jako nejnovější nástroje sestavení používané jakoukoli komponentou aplikace.
  • Statické knihovny nebo soubory objektů kompilované pomocí přepínače kompilátoru /GL (optimalizace celého programu) nebo propojeného pomocí/LTCG(generování kódu v době propojení)nejsou binární kompatibilní napříč verzemi, včetně aktualizací podverze. Všechny soubory objektů a knihovny kompilované pomocí /GL a /LTCG musí používat přesně stejné nástroje sestavení pro kompilaci a konečné propojení. Například kód vytvořený pomocí /GL nástrojů sestavení sady Visual Studio 2019 verze 16.7 nelze propojit s kódem vytvořeným v /GL nástrojích sestavení sady Visual Studio 2019 verze 16.8. Kompilátor generuje závažnou chybu C1047.

Upgrade distribuovatelné součásti Microsoft Visual C++ ze sady Visual Studio 2015 a novější

U sady Visual Studio 2015, 2017, 2019, 2022 a 2026 jsme zachovali číslo hlavní verze Microsoft Visual C++ Redistributable. To znamená, že najednou lze nainstalovat pouze jednu instanci Redistributable. Novější verze přepíše všechny starší verze, které už jsou nainstalované. Například jedna aplikace může nainstalovat Redistributable ze sady Visual Studio 2015. Pak další aplikace nainstaluje Redistributable ze sady Visual Studio 2026. Verze 2026 přepíše starší verzi, ale protože jsou binární, starší aplikace stále funguje správně. Ujistěte se, že nejnovější verze Redistributable obsahuje všechny nejnovější funkce, aktualizace zabezpečení a opravy chyb. Proto vždy doporučujeme upgradovat na nejnovější dostupnou verzi.

Podobně nemůžete nainstalovat starší redistributable, pokud je už nainstalovaná novější verze. Instalační program hlásí chybu, pokud se pokusíte. Pokud například nainstalujete Redistributable 2022 na počítač s nainstalovanou verzí 2026, zobrazí se podobná chyba:

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.

Tato chyba je navržená. Doporučujeme udržovat nejnovější verzi nainstalovanou. Ujistěte se, že se instalační program může obnovit z této chyby bezobslužně.

Důležité

Podpora knihovny modulu runtime pro systém Windows XP už není dostupná v nejnovějších Distribuovatelné součásti Visual C++ pro Visual Studio. Poslední redistributable pro podporu Systému Windows XP je verze 16.7 (soubor verze 14.27.29114.0). Pokud jsou vaše aplikace pro Windows XP nasazené nebo aktualizované na novější verzi redistributable, aplikace se nespustí. Další informace a informace o tom, jak získat verzi redistributable, která podporuje systém Windows XP, naleznete v tématu Konfigurace programů pro systém Windows XP.

Viz také

Historie změn v jazyce Visual C++
Nejnovější podporované soubory visual C++ Redistributable ke stažení
Jak auditovat využití verze modulu runtime Visual C++
Nejčastější dotazy k životnímu cyklu – Distribuovatelné knihovny visual C++ a knihovny modulu runtime