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) fordítóeszközkészletei nem garantálják a bináris kompatibilitást a főbb verziókban. Az eszközkészletek 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 a C++ eszközkészlet főszámában, amely a Visual Studio 2015 óta minden verzióhoz 14-zel kezdődik. (Az eszközkészlet verziója: Visual Studio 2015 esetén v140, 2017 esetén v141, 2019 esetén v142, és 2022 esetén v143). 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 vagy 2022 által készített alkalmazásban. Nincs szükség újrafordításra egy megfelelő eszközkészlettel. A Microsoft Visual C++ terjeszthető csomag (az újraterjeszthető) legújabb verziója mindegyikhez használható.
A bináris kompatibilitás korlátozásai
A v140, v141, v142 és v143 eszközkészletek és kisebb számozott verziófrissítések között három fontos korlátozás van a bináris kompatibilitásra:
- A v140, v141, v142 és v143 eszközkészletek különböző verzióival létrehozott bináris fájlok kombinálhatók. A fő szabály az, hogy a csatoló csak olyan eszközkészlet által létrehozott bemenetekkel működjön, amelyek azonos verziójúak (vagy korábbiak). 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 az eszközkészlet egy későbbi verziója által létrehozott, implicit módon csatolt DLL-hez tartozó importálási kódtár az eszközkészlet egy korábbi verziójával kapcsolható össze – különösen akkor, ha az importálási kódtár szigorúan
extern "C"
használ az importáláshoz/exportáláshoz. Íme néhány példa arra, hogy mindez mit jelent:- A 2017-es eszközkészlettel (v141, 15.0-15.9-es verzió) lefordított alkalmazások csatolhatók a Visual Studio 2022 17.8-s (v143) verziójával összeállított statikus kódtárhoz, de a csatolást a 17.8-es vagy újabb eszközkészlettel kell elvégezni.
- A VS 2015, 2017, 2019 vagy 2022 használatával létrehozott alkalmazások és kódtárak összekapcsolhatók, de a csatolást az eszközkészlet olyan verziójával kell elvégezni, amely ugyanolyan új vagy újabb, mint bármelyik bináris fájl elkészítéséhez használt legújabb eszközkészlet, amit a linkernek átad. 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ából készült eszközkészletekkel készült három bináris fájlt, a 16.11-es vagy újabb eszközökkészletek bármelyikével összekapcsolhatja őket.
- Ha egy DLL újabb eszközkészlettel van létrehozva, az importálási kódtár néha régebbi eszközkészletekkel is használható, ha az összes exportálás a C nyelv hívási konvencióját (
extern "C"
) követi. Az egyetlen hivatalosan támogatott eset azonban egy újabb windowsos SDK használata egy régebbi eszközkészlettel.
- Az alkalmazás által használt terjeszthető fájl hasonló bináris kompatibilitási korlátozással rendelkezik. Ha az eszközkészlet 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 eszközkészlet.
- 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. A/GL
és/LTCG
használatával lefordított objektumfájloknak és táraknak pontosan ugyanazt az eszközkészletet kell használniuk a fordításhoz és a végső hivatkozáshoz. A Visual Studio 2019 16.7-es eszközkészletében/GL
használatával létrehozott kód például nem kapcsolható össze a Visual Studio 2019 16.8-as eszközkészletének/GL
használatával létrehozott kóddal. 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 és 2022 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 Visual Studio 2022 Redistribútálható csomagját. A 2022-es 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. Ehhez hasonló hibaüzenet jelenik meg, ha a 2017-es vagy 2019-es terjeszthető verziót olyan gépen telepíti, amely már rendelkezik a 2022-es 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