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.