Megosztás:


C++ bináris kompatibilitás a Visual Studio-verziók között

A Visual Studio 2013 és korábbi verzióiban a Microsoft C++ (MSVC) buildelési eszközei nem garantálják a bináris kompatibilitást a főbb verziókban. A buildelési eszközök különböző verziói által létrehozott objektumfájlokat, statikus kódtárakat, dinamikus kódtárakat és végrehajtható fájlokat nem kapcsolhatja össze. Az ABI-k, az objektumformátumok és a futtatókörnyezeti kódtárak nem kompatibilisek.

Ezt a viselkedést módosítottuk a Visual Studio 2015 és újabb verzióiban. A fordító ezen verziói által lefordított futtatókörnyezeti kódtárak és alkalmazások binárisan kompatibilisek. Ez tükröződik az MSVC Build Tools főszámában, amely a Visual Studio 2015 óta minden verzióhoz 14-zel kezdődik. (A buildelési eszközök verziója a Visual Studio 2015 v140-es verziója, 2017-es v141-es, 2019-es v142-es és 2022-es v143-a). Tegyük fel, hogy vannak külső kódtárak, amelyeket a Visual Studio 2015 készített. Továbbra is használhatja őket a Visual Studio 2017, 2019, 2022 vagy 2026 által készített alkalmazásban. Nem kell újrafordítást elvégezni egy megfelelő verzióval. A Microsoft Visual C++ terjeszthető csomag (az újraterjeszthető) legújabb verziója mindegyikhez használható.

A bináris kompatibilitás korlátozásai

A bináris kompatibilitás három fontos korlátozást jelent a v140, v141, v142, v143 és v145 buildeszközök és kisebb számozott verziófrissítések között:

  • A v140, v141, v142, v143 és v145 buildeszközök különböző verzióival létrehozott bináris fájlok kombinálhatók. A fő szabály az, hogy a linker csak olyan buildelési eszközök által létrehozott bemenetekkel működjön, amelyek azonosak (vagy korábbiak), mint maga. Ez az alkalmazásokra, az importkönyvtárakra, a statikus könyvtárakra és más fájlokra vonatkozik, ahogy az a LINK bemeneti fájlokleírásban szerepel. Bizonyos esetekben a buildelési eszközök egy későbbi verziója által létrehozott implicit módon csatolt DLL importálási kódtára a buildelési eszközök egy korábbi verziójával kapcsolható össze – különösen akkor, ha az importálási kódtár szigorúan az importáláshoz/exportáláshoz használható extern "C" . Íme néhány példa arra, hogy mindez mit jelent:
    • A 2017-es buildelési eszközökkel (v141, 15.0-15.9-es verzió) lefordított alkalmazások csatolhatók a Visual Studio 2022 17.8-s verziójával (v143) összeállított statikus kódtárhoz, de a csatolást a 17.8-es vagy újabb buildelési eszközökkel kell elvégezni.
    • A VS 2015, 2017, 2019, 2022 és 2026 használatával készült alkalmazások és kódtárak összekapcsolhatók, de a csatolást a buildelési eszközök olyan verziójával kell elvégezni, amely a legutóbbi buildelési eszközökhöz hasonlóan vagy újabb, mint a linkernek átadott bináris fájlok létrehozásához használt legújabb buildeszközök. Ha például a VS 2015 14.3-as, a VS 2017 15.9-es és a VS 2019 16.11-es verziójával készült három bináris fájl van, ezeket a 16.11-es vagy újabb verziójú build eszközökkel is összekapcsolhatja.
    • Ha egy DLL újabb buildelési eszközökkel van létrehozva, az importálási kódtár néha régebbi buildeszközökkel is használható, ha az összes exportálás a C nyelvi hívási konvenciót (extern "C") követi. Az egyetlen hivatalosan támogatott eset azonban egy újabb windowsos SDK használata a régebbi buildelési eszközökkel.
  • Az alkalmazás által használt terjeszthető fájl hasonló bináris kompatibilitási korlátozással rendelkezik. Ha a buildelési eszközök különböző támogatott verziói által készített bináris fájlokat kever, az terjeszthető verziónak legalább olyan újnak kell lennie, mint bármely alkalmazásösszetevő által használt legújabb buildelési eszközöknek.
  • A /GL (teljes programoptimalizálás) fordítókapcsolóval vagy /LTCG (link-time code generation) használatával összekapcsolt statikus kódtárak vagy objektumfájloknem binárisan kompatibilisek a verziók között, beleértve az alverziófrissítéseket is. Az /GL és /LTCG használatával készült összes objektumfájlnak és könyvtárnak pontosan ugyanazokat a build eszközöket kell használnia a fordításhoz és a végső linkeléshez. A Visual Studio 2019 16.7-es build eszközeivel /GL létrehozott kód például nem fűzhető össze a Visual Studio 2019 16.8-as build eszközeivel /GL létrehozott kódokkal. A fordító C1047végzetes hibát bocsát ki.

A Microsoft Visual C++ terjeszthető verziójának frissítése a Visual Studio 2015-ről és újabb verziókról

A Visual Studio 2015, 2017, 2019, 2022 és 2026 esetében a Microsoft Visual C++ terjeszthető főverziószáma változatlan maradt. Ez azt jelenti, hogy egyszerre csak az újraterjeszthető példány telepíthető. Egy újabb verzió felülírja a már telepített régebbi verziót. Egy alkalmazás például telepítheti az terjeszthetőt a Visual Studio 2015-ből. Ezután egy másik alkalmazás telepíti a terjeszthetőt a Visual Studio 2026-ből. A 2026-os verzió felülírja a régebbi verziót, de mivel binárisan kompatibilisek, a korábbi alkalmazás továbbra is jól működik. Győződjön meg arról, hogy a terjeszthető legújabb verziója rendelkezik a legújabb funkciókkal, biztonsági frissítésekkel és hibajavításokkal. Ezért mindig azt javasoljuk, hogy frissítsen a legújabb elérhető verzióra.

Hasonlóképpen nem telepíthet régebbi terjeszthető verziót, ha egy újabb verzió már telepítve van. A telepítő hibát jelez, ha megpróbálja. Ilyen hibaüzenet jelenik meg például, ha a 2022-es terjeszthető verziót olyan számítógépre telepíti, amely már rendelkezik a 2026-os verzióval:

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.

Ez a hiba terv szerint történik. Javasoljuk, hogy a legújabb verzió legyen telepítve. Győződjön meg arról, hogy a telepítő csendesen helyre tud állni ebből a hibából.

Fontos

A Windows XP futtatókörnyezeti kódtárának támogatása már nem érhető el a Visual Studio legújabb Visual C++ terjeszthető változatában. A Windows XP támogatásának utolsó terjeszthető verziója a 16.7-es verzió (fájlverzió: 14.27.29114.0). Ha a Windows XP-alkalmazások az terjeszthető egy későbbi verziójával vannak üzembe helyezve vagy frissítve vannak, az alkalmazások nem fognak futni. További információkért és a Windows XP-t támogató terjeszthető verzió beszerzéséről Programok konfigurálása a Windows XP-hezcímű témakörben olvashat.

Lásd még:

Visual C++ változási előzményei
A legújabb támogatott Visual C++ terjeszthető letöltések
A Visual C++ futtatókörnyezet verzióhasználatának naplózása
Életciklus gyakori kérdések – Visual C++ terjeszthető és futtatókörnyezeti kódtárak