Perusahaan kami akan membeli sepotong kode sumber yang besar dan sangat kompleks untuk komunikasi satelit.
Ini dikodekan dalam C ++ dan kami akan menambahkan kode untuk itu, juga di C ++, menghubungkan kode kami dengan kode yang dibeli ke dalam satu unit yang dapat dieksekusi.
Apakah kita perlu menggunakan kompiler yang sama dan versi kompiler yang sama seperti yang digunakan untuk mengembangkan kode yang dibeli?
Apakah kita perlu menggunakan versi C ++ yang sama dengan kode yang dibeli? Jika tidak menggunakan 2014, kami _might_ ingin menggunakan beberapa fitur itu, tetapi tidak jika mungkin ada beberapa masalah dengan pencampuran versi yang berbeda.
Secara teori, tentu saja, seharusnya tidak menjadi masalah, terutama versi bahasa, tetapi dapat dibayangkan bahwa versi berbeda dari kompiler akan menghasilkan kode objek yang berbeda, yang berpotensi mengarah pada perbedaan waktu, dll.
Apa yang harus kita waspadai?
Jawaban:
Tergantung.
Compiler menghasilkan kode yang menargetkan ABI. Beberapa menggunakan ABI umum (misalnya, jika saya tidak salah, baik dentang ++ dan g ++ target disebut Itanium ABI) dan Anda harus - mungkin ada bug yang mencegah Anda melakukannya - dapat menggunakan kode objek dari keduanya dalam program yang sama (dengan asumsi tentu saja Anda menggunakan versi yang menargetkan versi ABI yang sama). Hal yang sama berlaku antara versi kompiler: beberapa lebih memperhatikan untuk menjaga ABI yang sama di antara versi daripada yang lain. Jelas, mereka semua kadang-kadang membutuhkan perubahan ABI, dan mereka mungkin terpaksa melakukannya dengan cara yang tidak kompatibel. Dan jelas, beberapa pengaturan seperti pilihan standar bahasa mungkin memiliki pengaruh pada pilihan ABI.
Lalu ada masalah perpustakaan standar. Kompiler (atau versi berbeda dari kompiler yang sama) sendiri dapat menggunakan ABI yang sama, namun pustaka standarnya mungkin tidak kompatibel (dan beberapa kompiler seperti dentang ++ mungkin dapat digunakan dengan beberapa pustaka standar). Mampu membuatnya berfungsi mungkin tergantung pada apa yang digunakan di antarmuka.
Dengan kata lain, Anda harus menggali dan menemukan informasi untuk kasus khusus Anda. Sebagai titik awal dan contoh jenis informasi apa yang harus Anda cari, berikut adalah informasi yang disediakan oleh libstdc ++ (perpustakaan yang digunakan oleh g ++ dan dalam beberapa konfigurasi oleh dentang ++)
sumber
Ini bukan pertanyaan teknis. Ini adalah pertanyaan hukum tentang apa yang Anda tulis dalam kontrak Anda. Pastikan vendor perangkat lunak memberi Anda versi yang dijamin olehnya untuk dapat digunakan di lingkungan Anda. Jika tidak, akan selalu ada risiko tertentu untuk mengalami masalah dengan kompiler, versi kompiler, atau versi bahasa yang berbeda.
Ini sangat penting ketika Anda membeli komponen atau bagian-bagian itu sebagai sumber tertutup. Bahkan jika pemasok Anda menjamin Anda dapat menggunakan komponen dengan lingkungan kompiler Anda saat ini, apakah dia menjamin dia akan memberi Anda pembaruan jika Anda ingin beralih ke versi kompiler yang lebih baru di masa depan? Jika Anda tidak memiliki akses ke kode sumber lengkap, Anda mungkin tidak akan beruntung mencoba menyelesaikan masalah kompatibilitas sendiri. Itu sebabnya Anda tidak hanya harus membeli perangkat lunak, tetapi juga memikirkan kontrak perawatan jangka panjang dengan pemasok Anda.
sumber
Kedengarannya bagus!
Berbicara secara umum, tidak, itu tidak perlu. Tujuan dari C ++ adalah untuk bertindak sebagai abstraksi atas hal-hal ini, sehingga program C ++ yang ditulis dengan baik akan mengkompilasi dengan baik pada toolchain Anda seperti yang dilakukan pada pembuat asli, dan program yang dihasilkan akan memiliki hasil yang sama. Kinerja dapat bervariasi, karena kompiler yang berbeda pandai dalam hal yang berbeda, tetapi perilaku dasar program tidak boleh berubah.
Namun, perangkat lunak yang ditulis dengan buruk dapat mengandalkan perilaku khusus implementasi, atau bahkan perilaku yang tidak terdefinisi. Ini dapat membuat asumsi tentang tipe bawaan, atau tentang endianness platform. Bahkan perangkat lunak yang ditulis dengan baik mungkin tidak memiliki pilihan selain mengandalkan ekstensi non-standar yang tidak tersedia pada rantai alat yang Anda pilih, atau mungkin melakukannya karena tidak perlu menghabiskan waktu untuk menambahkan lapisan portabilitas dalam durasi proyek asli.
Pada akhirnya, Anda harus bertanya kepada pembuat / vendor untuk apa kode sumber ditulis. Jika mereka mengklaim bahwa itu secara khusus menentang, katakanlah, Visual Studio 2015, dan memerlukan fitur Windows API, Anda mungkin harus tetap menggunakannya. Tetapi jika mereka mengklaim itu portabel, standar C ++, maka gunakan kompiler apa pun yang Anda suka. Pastikan perjanjian pembelian Anda menyertakan pengaturan dukungan sehingga Anda bisa mendapatkan bantuan gratis saat ternyata vendor berbohong.
Mungkin. Mungkin.
C ++ 03 kompatibel ke depan untuk sebagian besar, jadi, jika kodenya C ++ 03, maka Anda tidak akan mengalami masalah. (Meskipun beberapa tweak mungkin diperlukan.)
Tetapi fitur-fitur yang diperkenalkan dalam C ++ 11 dan C ++ 14 tidak kompatibel-mundur jadi jika vendor menggunakan, katakanlah, C ++ 11 lambdas, dan Anda mencoba untuk membangun kode mereka dalam kompiler C ++ 03, yang baru saja memenangkan bekerja.
Benar. Jika kode sangat bergantung pada implementasi spesifik untuk mendapatkan hasil yang diharapkan, maka tergantung pada vendor untuk bertanggung jawab dan memberi tahu Anda mengenai hal itu. Karena kita hidup di dunia nyata, saya sarankan untuk rajin dan bertanya kepada mereka terlebih dahulu.
Dan saya akan menggemakan apa yang dikatakan orang lain: memastikan bahwa Anda memiliki semacam dukungan bantuan, sehingga jika mereka salah mengartikan salah satu dari respons terhadap pertanyaan-pertanyaan ini (baik sengaja atau tidak), Anda tidak akhirnya memikul biaya yang dihasilkan.
sumber
Anda tidak menautkan kode, Anda menautkan file objek yang dikompilasi.
Dalam hal ini ya, menggunakan kompiler C ++ yang berbeda (atau bahkan pengaturan seperti debug / rilis build), atau versi yang berbeda, atau pustaka standar yang berbeda (versi) ketika membangun bagian yang akan berinteraksi pada tingkat biner sangat mungkin untuk memecahkan aplikasi jika bagian berkomunikasi satu sama lain menggunakan lebih dari C API.
Fitur seperti wadah atau pengecualian menyediakan antarmuka yang sama tetapi, pada tingkat biner, dapat diimplementasikan dalam banyak cara berbeda yang tidak kompatibel.
Namun, menggunakan kompiler yang berbeda untuk mengkompilasi seluruh kode adalah masalah yang berbeda. Pertanyaan untuk dipertimbangkan:
Ada juga risiko bahwa kode dapat berisi bagian-bagian yang mengakibatkan perilaku tidak terdefinisi. Ini bisa berfungsi dengan baik ketika menggunakan satu kompiler tetapi gagal dengan cara yang misterius ketika menggunakan yang lain.
sumber
Nah, beralih kompiler, dapat menyebabkan beberapa masalah; Saat ini di perusahaan saya, kami menggunakan Dentang dan MSVC, dan kami memiliki kesalahan dalam satu kompiler yang tidak ditandai oleh yang lain.
Itu tidak perlu, tetapi tentu saja Anda kompiler harus mendukung versi C ++ yang ingin Anda gunakan. C ++ menjamin kompatibilitas retro mulai dari semua versi.
sumber
Satu masalah besar ketika mengganti kompiler adalah perilaku yang tidak terdefinisi: Jika kode yang Anda terima memanggil perilaku yang tidak terdefinisi, maka segala sesuatu mungkin terjadi - termasuk bahwa kode tersebut berfungsi dengan baik dan melewati semua pengujian saat menggunakan kompiler, dan sangat salah dengan kompiler Anda.
Itu mungkin, tetapi dalam situasi itu Anda mungkin juga mengalami masalah jika Anda mengubah level optimisasi, gunakan versi berikutnya dari kompiler yang sama dan seterusnya. Jadi tidak ada yang bisa Anda hindari.
sumber