2009-05-19 8 views
6

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++

+0

All'inizio pensavo volesse dire Red Hat 5.2 (Apollo), che ha più di dieci anni. :) – bk1e

risposta

1

Forse è più semplice statico collegare l'eseguibile ... crea un grosso binario, ma gira su tutte le piattaforme.

6

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.

0

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.

0

IIRC, esiste una libreria di compatibilità C++ che viene utilizzata per fare proprio questo. Penso che si chiami libstdC++ - compat.

+0

Non è possibile collegare insieme oggetti che dipendono da diverse versioni di stdlibC++. – ephemient

5

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.

+0

Questa è la teoria, ma nella pratica l'ultima modifica ABI era 3.4 –

+0

@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). –