GNU/Linux >> Belajar Linux >  >> Linux

Bisakah Clang mengkompilasi kode dengan GCC yang dikompilasi .a libs?

Setidaknya untuk pustaka Crypto++ ini tidak berfungsi (diverifikasi :-( ). Jadi untuk kode c++ kemungkinannya kecil untuk berfungsi, sedangkan kode c murni mungkin akan ditautkan OK.

EDIT:Masalah mulai muncul dengan Mac OS X 10.9 Mavericks dan Xcode-5, yang mengalihkan pustaka C++ default untuk dentang dari libstdc++ ke libc++. Itu tidak ada di Mac OS X 10.8 dan sebelumnya.

Solusinya tampaknya adalah:jika Anda perlu mengkompilasi kode C++ dengan dentang, dan menautkannya ke pustaka yang dikompilasi gcc, gunakan "dentang++ -stdlib=libstdc++". Penautan berhasil, dan biner yang dihasilkan berjalan dengan benar.

CAVEAT:Tampaknya tidak bekerja dengan cara lain:meskipun Anda dapat membangun perpustakaan yang dikompilasi dengan "clang++ -stdlib=libstdc++" dan menautkan kode yang dikompilasi gcc dengannya, kode ini akan macet dengan SEGV. Sejauh ini saya menemukan satu-satunya cara untuk menautkan dengan pustaka yang dikompilasi dentang adalah dengan mengompilasi kode Anda dengan dentang, bukan gcc.

EDIT2 :GCC-12 sepertinya menyertakan -stdlib= bendera. Kompilasi dengan g++ -stdlib=libc++ membuat Clang++ -file objek yang kompatibel. Sangat bagus.


Ya, kamu biasanya dapat menggunakan clang dengan pustaka yang dikompilasi GCC (dan sebaliknya, gunakan gcc dengan perpustakaan yang dikompilasi CLANG), karena sebenarnya itu bukan kompilasi tetapi penautan yang relevan. Anda mungkin tidak beruntung dan mendapatkan kejutan yang tidak menyenangkan.

Pada prinsipnya Anda dapat memiliki beberapa ketergantungan pada versi libstdc++ digunakan untuk menautkan pustaka yang relevan (jika dikodekan dalam C++). Sebenarnya, itu biasanya tidak terlalu menjadi masalah.

Dalam C++, nama mangling mungkin secara teori menjadi masalah (mungkin ada beberapa kasus sudut, bahkan ketidakcocokan antara dua versi berbeda dari g++ ). Sekali lagi, dalam praktiknya hal ini biasanya tidak menjadi masalah.

Jadi biasanya Anda dapat mencampur CLANG (bahkan versi yang berbeda tetapi mirip) dengan GCC tetapi Anda mungkin memiliki kejutan yang tidak menyenangkan. Apa yang diharapkan dari kompiler C++ mana pun (baik itu CLANG atau GCC) hanya untuk dapat mengkompilasi dan menautkan seluruh perangkat lunak (dan semua perpustakaan) bersama-sama menggunakan kompiler dan versi yang sama (dan itu termasuk implementasi pustaka standar C++ yang sama ). Inilah sebabnya mengapa memutakhirkan kompiler dalam distribusi membutuhkan banyak pekerjaan:pembuat distribusi harus memastikan bahwa semua paket dikompilasi dengan baik (dan mereka mendapatkan kejutan!).

Berhati-hatilah karena versi libstdc++ memang penting. Baik komunitas Dentang &GCC bekerja keras untuk membuat ABI-nya kompatibel untuk pemutakhiran kompiler, tetapi ada kasus sudut yang tidak kentara. Baca dokumentasi implementasi pustaka standar C++ khusus dan spesifik Anda. Kasus sudut ini dapat menjelaskan error misterius saat menggunakan biner library C++ yang bagus (dikompilasi dengan GCC 5) dalam kode Anda yang dikompilasi dengan GCC 8. Bug tidak ada di library, tetapi ABI berevolusi dengan tidak kompatibel.


Linux
  1. Cara mengkompilasi biner 32-bit pada mesin linux 64-bit dengan gcc/cmake

  2. berjuang dengan c ++ IDE di linux

  3. Bagaimana cara mendapatkan jejak tumpukan untuk C++ menggunakan gcc dengan informasi nomor baris?

  1. C/C++ dengan GCC:Menambahkan file sumber daya secara statis ke executable/library

  2. Bootloader saya tidak dapat dikompilasi dengan gcc 4.6 dan 4.7 ... hanya 4.5

  3. Menautkan perpustakaan bersama dengan lib bersama lainnya di linux

  1. Aplikasi C++ diakhiri dengan 143 kode keluar - apa artinya?

  2. Mengapa dentang masih membutuhkan libgcc.a untuk mengkompilasi kode saya?

  3. Tidak dapat memanggil fungsi pustaka standar C pada Linux 64-bit dari kode rakitan (yasm).