Bagikan melalui


Kompatibilitas biner C++ antara versi Visual Studio

Toolset kompilator Microsoft C++ (MSVC) di Visual Studio 2013 dan yang lebih lama tidak menjamin kompatibilitas biner di seluruh versi utama. Anda tidak dapat menautkan file objek, pustaka statis, pustaka dinamis, dan file yang dapat dieksekusi yang dibangun oleh berbagai versi toolset ini. ABI, format objek, dan pustaka runtime tidak kompatibel.

Kami telah mengubah perilaku ini di Visual Studio 2015 dan versi yang lebih baru. Pustaka runtime dan aplikasi yang dikompilasi oleh salah satu versi pengkompilasi ini kompatibel dengan biner. Ini tercermin dalam nomor utama toolset C++, yang dimulai dengan 14 untuk semua versi sejak Visual Studio 2015. (Versi toolset adalah v140 untuk Visual Studio 2015, v141 untuk 2017, v142 untuk 2019, dan v143 untuk 2022). Katakanlah Anda memiliki pustaka pihak ketiga yang dibangun oleh Visual Studio 2015. Anda masih dapat menggunakannya dalam aplikasi yang dibangun oleh Visual Studio 2017, 2019, atau 2022. Tidak perlu melakukan kompilasi ulang dengan set alat yang cocok. Versi terbaru paket Microsoft Visual C++ Redistributable (Redistributable) berfungsi untuk semuanya.

Pembatasan kompatibilitas biner

Ada tiga batasan penting pada kompatibilitas biner antara toolset v140, v141, v142, dan v143 dan pembaruan versi bernomor minor:

  • Biner yang dibuat dengan berbagai versi toolset v140, v141, v142, dan v143 dapat digabungkan. Aturan utamanya adalah bahwa linker hanya boleh bekerja dengan input yang dibangun oleh toolset yang merupakan versi yang sama (atau lebih lama) seperti itu sendiri. Ini berlaku untuk aplikasi, pustaka impor, pustaka statis, dan file lainnya seperti yang dijelaskan dalam file input LINK. Dalam beberapa kasus, pustaka impor untuk DLL yang ditautkan secara implisit yang dibangun oleh versi toolset yang lebih baru dapat ditautkan menggunakan versi toolset yang lebih lama--terutama jika pustaka impor benar-benar digunakan extern "C" untuk impor/ekspor. Berikut adalah beberapa contoh apa artinya ini semua:
    • Aplikasi yang dikompilasi dengan toolset 2017 (v141, versi 15.0 hingga 15.9) dapat ditautkan ke pustaka statis yang dikompilasi dengan Visual Studio 2022 versi 17.8 (v143), tetapi penautan harus dilakukan menggunakan toolset versi 17.8 atau yang lebih baru.
    • Aplikasi dan pustaka yang dibuat menggunakan VS 2015, 2017, 2019, atau 2022 dapat ditautkan bersama-sama, tetapi penautan harus dilakukan menggunakan versi toolset yang terbaru, atau lebih baru daripada, toolset terbaru yang digunakan untuk membangun salah satu biner yang Anda teruskan ke linker. Misalnya, mengingat tiga biner yang dibangun dengan toolset dari VS 2015 versi 14.3, VS 2017 versi 15.9, dan VS 2019 versi 16.11, Anda dapat menautkannya menggunakan versi toolset apa pun yang 16.11 atau yang lebih baru.
    • Jika DLL dibangun dengan toolset yang lebih baru, pustaka impor terkadang dapat digunakan dengan toolset yang lebih lama jika semua ekspor mengikuti konvensi panggilan bahasa C (extern "C"). Namun, satu-satunya kasus yang didukung secara resmi adalah mengkonsumsi SDK windows yang lebih baru dengan toolset yang lebih lama.
  • Redistributable yang digunakan aplikasi Anda memiliki batasan kompatibilitas biner yang serupa. Saat Anda mencampur biner yang dibangun oleh berbagai versi toolset yang didukung, versi Redistributable harus setidaknya sama baru dengan toolset terbaru yang digunakan oleh komponen aplikasi apa pun.
  • Pustaka statis atau file objek yang dikompilasi menggunakan /GL sakelar pengkompilasi (Pengoptimalan seluruh program) atau ditautkan menggunakan/LTCG (Pembuatan kode waktu tautan) tidak kompatibel dengan biner di seluruh versi, termasuk pembaruan versi minor. Semua file objek dan pustaka yang dikompilasi menggunakan /GL dan /LTCG harus menggunakan toolset yang sama persis untuk kompilasi dan tautan akhir. Misalnya, kode yang dibuat dengan menggunakan /GL di toolset Visual Studio 2019 versi 16.7 tidak dapat ditautkan ke kode yang dibangun dengan menggunakan /GL di toolset Visual Studio 2019 versi 16.8. Pengkompilasi memancarkan kesalahan Fatal C1047.

Meningkatkan Microsoft Visual C++ Redistributable dari Visual Studio 2015 dan yang lebih baru

Kami telah mempertahankan nomor versi utama Microsoft Visual C++ Redistributable sama untuk Visual Studio 2015, 2017, 2019, dan 2022. Itu berarti hanya satu instans Redistributable yang dapat diinstal pada satu waktu. Versi yang lebih baru menimpa versi lama apa pun yang sudah diinstal. Misalnya, satu aplikasi dapat menginstal Redistributable dari Visual Studio 2015. Kemudian, aplikasi lain menginstal Redistributable dari Visual Studio 2022. Versi 2022 menimpa versi lama, tetapi karena kompatibel dengan biner, aplikasi sebelumnya masih berfungsi dengan baik. Kami memastikan versi terbaru Redistributable memiliki semua fitur terbaru, pembaruan keamanan, dan perbaikan bug. Itulah sebabnya kami selalu menyarankan Anda meningkatkan ke versi terbaru yang tersedia.

Demikian pula, Anda tidak dapat menginstal Redistributable yang lebih lama ketika versi yang lebih baru sudah diinstal. Alat penginstal melaporkan kesalahan jika Anda mencoba. Anda akan melihat kesalahan seperti ini jika Anda menginstal Redistributable 2017 atau 2019 pada komputer yang sudah memiliki versi 2022:

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.

Kesalahan ini didesain. Kami sarankan Anda menjaga versi terbaru tetap terinstal. Pastikan alat penginstal Anda dapat pulih dari kesalahan ini secara diam-diam.

Penting

Dukungan pustaka runtime untuk Windows XP tidak lagi tersedia di Visual C++ Redistributable terbaru untuk Visual Studio. Yang terakhir dapat didistribusikan ulang untuk mendukung Windows XP adalah versi 16.7 (file versi 14.27.29114.0). Jika aplikasi Windows XP Anda disebarkan dengan atau diperbarui ke versi yang lebih baru dari yang dapat didistribusikan ulang, aplikasi tidak akan berjalan. Untuk informasi selengkapnya, dan cara mendapatkan versi redistributable yang mendukung Windows XP, lihat Mengonfigurasi program untuk Windows XP.

Lihat juga

Riwayat perubahan Visual C++
Unduhan Visual C++ Redistributable terbaru yang didukung