Sto lavorando su redhat 5.2 su un progetto che si estende su diverse organizzazioni disparate. Ogni organizzazione fornisce librerie che sono state compilate con varie versioni di g ++. Attualmente, queste versioni includono 4.1.1, 4.1.2 e 4.3.1. Sto cercando di collegare tutte le librerie insieme in un eseguibile usando 4.1.2. Che cosa, se c'è qualche problema, posso aspettarmi facendo questo? Per inciso, c'è un modo per dire a quale ABI si adatta ogni versione del compilatore?Mixare librerie da diversi compilatori C++
risposta
Forse è più semplice statico collegare l'eseguibile ... crea un grosso binario, ma gira su tutte le piattaforme.
Questo documento di politica ABI specifica la compatibilità tra le diverse versioni di ABI. In base a ciò, la libreria libstdc++.so
deve essere compatibile e l'ultima volta che la compatibilità binaria con broker gcc è stata impostata su 3.4. Dovresti stare bene.
Non dovrebbero esserci problemi nel collegamento di librerie create da diverse versioni di g ++ a meno che non siano state elencate sul sito Web di g ++. Ciò che è importante è che queste librerie siano costruite sulla stessa piattaforma che nel tuo caso è redhat 5.2. Una libreria creata per una piattaforma diversa da linux/redhat (ad esempio solaris) non si collegherà al tuo exe.
IIRC, esiste una libreria di compatibilità C++ che viene utilizzata per fare proprio questo. Penso che si chiami libstdC++ - compat.
Non è possibile collegare insieme oggetti che dipendono da diverse versioni di stdlibC++. – ephemient
GCC (Raccolta GNU Compiler) definisce i numeri di versione e la compatibilità.
Le librerie G ++ tra 4.1.1 e 4.1.2 devono essere compatibili; link con il più recente.
Le librerie G ++ tra 4.1.xe 4.2.x non sono compatibili; hai bisogno di ricompilare qualcosa.
Le librerie G ++ tra 3.x.y e 4.p.q non sono compatibili; hai bisogno di ricompilare qualcosa.
Nel tuo scenario, il codice creato con 4.3.1 non è compatibile con il resto.
O si dovrà ricostruire il codice correntemente compilato con 4.3.x in modo che utilizzi 4.1.x, oppure è necessario ricompilare il codice correntemente compilato con 4.1.x in modo da utilizzare invece il 4.3.x.
Questa è la teoria, ma nella pratica l'ultima modifica ABI era 3.4 –
@Edu: ma in qualsiasi momento, in futuro, potrebbe esserci un cambiamento che invoca quella regola, e le persone che sono diventate sciatte riguardo alle cose potrebbero essere una sorpresa (dover ricompilare). –
All'inizio pensavo volesse dire Red Hat 5.2 (Apollo), che ha più di dieci anni. :) – bk1e