2015-09-07 24 views
20

clang ++ e g ++ sono ABI incompatibili, anche per cose come core come contenitori standard, secondo, ad esempio, il sito Web clang ++.Se clang ++ e g ++ sono ABI incompatibili, cosa viene usato per le librerie condivise in binario?

Debian viene fornito con librerie condivise C++, ad es. Libboost, ecc. Compilate con ~ qualcosa e i programmi utente che utilizzano entrambi i compilatori funzionano generalmente ei nomi delle librerie non vengono alterati con il compilatore utilizzato per essi. Quando installi clang, debian non va a prendere versioni duplicate di ogni libreria C++ installata sul tuo sistema.

Qual è l'affare? La capacità di clang di collegarsi alle librerie C++ fornite dalla distro è più forte di quanto gli sviluppatori di compilatori (per fortuna cauti) descrivono?

+3

Ho pensato che in realtà, il clang dovrebbe essere compatibile con ABI con gcc, altrimenti hai ragione che questo sarebbe un enorme incubo. non sono sicuro però Pensavo che il clang avesse sostanzialmente bisogno di adottare questa politica per decollare. –

+0

Abbastanza correlati: https://stackoverflow.com/questions/11682748/is-clang-abi-same-as-g?rq=1 – edmz

+0

Non vorrei dire che sono un duplicato, esattamente.Questa domanda si riferisce a versioni molto specifiche. – Puppy

risposta

24

anche per cose come nucleo come contenitori standard

container standard non sono poi così "core". (Per le implementazioni tipiche) sono implementate interamente in C++ valido nelle intestazioni e, se compilate le stesse intestazioni con G ++ e Clang ++, otterrete l'output compatibile con ABI. Dovresti ottenere incompatibilità "anche per cose fondamentali come contenitori standard" se usi versioni diverse delle intestazioni del contenitore, non solo usando Clang anziché GCC.

Sia GCC e Clang conformi ad un cross-vendor, piattaforme C++ ABI (originariamente sviluppato per l'architettura Itanium, ma anche usato per x86, x86_64, SPARC ecc) La davvero cose fondamentali come la layout classe, nome mangling, gestione delle eccezioni, vtables ecc. sono specificati da ABI e Clang e GCC lo seguono entrambi.

Quindi, in altre parole, se si compila la stessa fonte con GCC e Clang, si ottengono i binari compatibili con ABI.

Se vuoi capire meglio questa roba vedi le mie diapositive What's an ABI and why is it so complicated?.

2

Questo probabilmente non risponderà alla domanda esatta correttamente:

Qualche tempo fa ho provato a compilare alcuni file oggetto colpa del gcc, un altro file oggetto con clang. Alla fine ho collegato tutto e ha funzionato correttamente.

Credo che le distribuzioni Linux utilizzino gcc, perché ho esaminato alcuni Makefile di Ubuntu e CentOS e hanno usato gcc.

+1

Non tutte le distribuzioni, ad es. OpenMandriva usa Clang per quasi l'intero dsitro. –

20

G ++ e Clang sono per la stragrande maggioranza completamente compatibili ABI. Inoltre, le incompatibilità ABI per i contenitori Standard sono proprietà dell'implementazione della libreria standard (libstdC++ o libC++), non del compilatore. Pertanto, non c'è bisogno di alcuna ri-compilazione.

Clang non avrebbe mai potuto decollare se non fosse compatibile ABI con g ++, in quanto sarebbe praticamente inutilizzabile senza un grande seguito preesistente. In effetti, Clang è così compatibile con GCC, essi comprendono praticamente tutta l'interfaccia della riga di comando di g ++, i componenti intrinseci del compilatore, i bug, ecc. In modo che tu possa letteralmente cadere in Clang anziché in G ++ e nella stragrande maggioranza del tempo, tutto solo lavoro.

+0

Questo è esattamente corretto. Clang usa la manipolazione dei nomi di GCC e le convenzioni di chiamata di GCC. È così compatibile con GCC che, su OS X con Xcode, 'g ++' è effettivamente un link simbolico a 'clang ++'. – nneonneo

+3

Per essere più corretti, sono gli ABI, che non sono GCC. Itanium ABI è indipendente da GCC. – Puppy

+1

Non ne avevo mai sentito parlare. Puoi dare alcuni esempi di bug g ++ che mimano ++ mimici? –