Rumah >pembangunan bahagian belakang >C++ >Bolehkah Objek Disusun dengan Piawaian C Berbeza Dihubungkan Bersama Dengan Selamat?
Bolehkah Objek yang Disusun dengan Piawaian C Berbeza Dipaut Dengan Selamat Bersama?
Andaikan anda mempunyai tiga objek yang disusun (A, B, C) daripada versi pengkompil yang sama. Mereka telah disusun dengan piawaian C yang berbeza: C 11, C 14, dan C 17 masing-masing. Walau bagaimanapun, pengepala semuanya ditulis dalam C 11 dan menggunakan binaan dengan semantik tidak berubah merentas semua versi.
Pertimbangan GCC
Untuk GCC, memautkan sebarang gabungan objek ini ialah selamat. Versi standard (iaitu, pilihan -std) tidak relevan kerana objek tersebut serasi dengan ABI jika dibina dengan versi GCC yang sama.
Walau bagaimanapun, masalah timbul jika objek yang disusun dengan versi GCC berbeza menggunakan ciri yang tidak stabil daripada yang baharu C standard sebelum sokongan GCC selesai. Sebagai contoh, memautkan objek yang disusun dengan GCC 4.9 dan 5 dengan -std=c 11 boleh menyebabkan isu kerana sokongan C 11 adalah percubaan dalam GCC 4.x. Begitu juga, memautkan objek daripada GCC 7 dan 8 dengan -std=c 17 boleh menyebabkan masalah disebabkan sokongan C 17 percubaan yang berkembang.
Sebaliknya, sebarang gabungan objek berikut akan berfungsi:
Memandangkan sokongan C 03 adalah stabil, komponen C 03 adalah serasi merentas semua objek. Objek E dan F menggunakan versi C 11 yang stabil, dan Objek D tidak menggunakan ciri C 11. Ciri C 17 Objek F tidak menjejaskan objek lain, kerana ia hanya berkongsi komponen C 03 atau C 11. Menyusun objek keempat, G, dengan GCC 8 dan -std=c 17 memerlukan penyusunan semula F dengan versi yang sama (atau tidak memaut ke F) untuk memastikan simbol C 17 yang serasi.
Untuk atur cara yang menggunakan libstdc .so perpustakaan kongsi, ia mestilah sekurang-kurangnya sama baharu seperti versi GCC yang digunakan untuk menyusun mana-mana objek. Untuk keserasian antara objek menggunakan std::string, semua objek harus disusun dengan pelaksanaan rentetan yang sama. Gunakan -D_GLIBCXX_USE_CXX11_ABI=0 untuk pelaksanaan asal dan -D_GLIBCXX_USE_CXX11_ABI=1 untuk pelaksanaan baharu.
Atas ialah kandungan terperinci Bolehkah Objek Disusun dengan Piawaian C Berbeza Dihubungkan Bersama Dengan Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!