GNU/Linux >> Linux Esercitazione >  >> Linux

Clang può compilare codice con le librerie .a compilate da GCC?

Almeno per la libreria Crypto++ questo non funziona (verificato :-( ). Quindi per il codice c++ è meno probabile che funzioni, mentre il codice c puro probabilmente collegherebbe OK.

EDIT:il problema ha iniziato ad apparire con Mac OS X 10.9 Mavericks e Xcode-5, che ha cambiato la libreria C++ predefinita per clang da libstdc++ a libc++. Non esisteva su Mac OS X 10.8 e versioni precedenti.

La soluzione sembra essere:se devi compilare codice C++ con clang e collegarlo a una libreria compilata con gcc, usa "clang++ -stdlib=libstdc++". Il collegamento ha esito positivo e il file binario risultante viene eseguito correttamente.

CAVEAT:Non sembra funzionare nell'altro modo:anche se puoi creare una libreria compilata con "clang++ -stdlib=libstdc++" e collegare ad essa il codice compilato da gcc, questo codice andrà in crash con SEGV. Finora ho scoperto che l'unico modo per collegarsi a una libreria compilata con clang è compilare il codice con clang, non con gcc.

EDIT2 :GCC-12 sembra includere -stdlib= bandiera. Compilazione con g++ -stdlib=libc++ crea Clang++ file oggetto compatibili. Molto bello.


Sì, di solito può usare clang con librerie compilate GCC (e viceversa, usa gcc con CLANG librerie compilate), perché in realtà non è la compilazione ma il collegamento che è rilevante. Potresti essere sfortunato e ricevere spiacevoli sorprese.

In linea di principio potresti avere alcune dipendenze dalla versione di libstdc++ utilizzato per collegare le librerie pertinenti (se sono codificate in C++). In realtà, questo di solito non ha molta importanza.

In C++, il name mangling potrebbe in teoria essere un problema (potrebbero esserci alcuni casi limite, persino incompatibilità tra due diverse versioni di g++ ). Di nuovo, in pratica di solito non è un problema.

Quindi di solito puoi mescolare CLANG (anche versioni diverse ma simili) con GCC ma potresti avere spiacevoli sorprese. Ciò che ci si dovrebbe aspettare da qualsiasi compilatore C++ (sia esso CLANG o GCC) è solo essere in grado di compilare e collegare insieme un intero software (e tutte le librerie) usando lo stesso compilatore e la stessa versione (e che include la stessa implementazione della libreria standard C++ ). Questo è il motivo per cui l'aggiornamento di un compilatore in una distribuzione richiede molto lavoro:i creatori della distribuzione devono assicurarsi che tutti i pacchetti vengano compilati bene (e ricevono sorprese!).

Attenzione che la versione di libstdc++ è importante. Entrambe le comunità Clang e GCC lavorano duramente per rendere il suo ABI compatibile per gli aggiornamenti del compilatore, ma ci sono casi limite sottili. Leggi la documentazione della tua particolare e specifica implementazione della libreria standard C++. Questi casi limite potrebbero spiegare misteriosi arresti anomali quando si utilizza un buon binario della libreria C++ (compilato con GCC 5) nel codice compilato con GCC 8. Il bug non è nella libreria, ma l'ABI si è evoluto in modo incompatibile.


Linux
  1. Come compilare un binario a 32 bit su una macchina Linux a 64 bit con gcc/cmake

  2. alle prese con gli IDE c++ su Linux

  3. Come ottenere una traccia dello stack per C++ usando gcc con le informazioni sul numero di riga?

  4. C/C++ con GCC:aggiunta statica di file di risorse all'eseguibile/libreria

  5. Il mio bootloader non può essere compilato con gcc 4.6 e 4.7 ... solo 4.5

Puoi usare le ancore ^ $ con Ls?

Come posso profilare il codice C++ in esecuzione su Linux?

Impossibile compilare un esempio dai buffer del protocollo di Google

Possiamo usare il codice C in Python?

Il raggruppamento Regex corrisponde alla libreria Regex C++ 11

VS Code non creerà programmi c++ con più file di origine .ccp