2010-11-09 8 views
29

Se compilo un programma C++ sulla mia macchina e lo eseguo su un altro (con software precedente) ottengo: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found.Versioni GLIBCXX

Infatti sul mio glibc sistema è più recente (ho ottenuto gcc-4.5.1 librerie: libstdC++ so.6.0.14.) E strings /usr/lib/libstdc++.so.6 | grep GLIBCXX stampe da GLIBCXX_3.4 a GLIBCXX_3.4.14. Sull'altro sistema, invece, stampa solo fino a GLIBCXX_3.4.8 (ho ottenuto libstdC++. So.6.0.8).

Così ho alcune domande:

  1. Perché il mio linker collega i binari C++ contro libstdC++ versione GLIBCXX_3.4.9 invece di GLIBCXX_3.4.14?

  2. Se ho rispettato il mio binario contro la versione libstdC++ GLIBCXX_3.4, suppongo che funzionerebbe quasi ovunque. Ciò implicherebbe qualsiasi tipo di problema? (Ad esempio: sarebbe utilizzare anziani -e quindi worse- implementazioni algoritmo?)

  3. Se invece ho staticamente collegare il mio programma contro la mia libstdC++ Credo che verrà eseguito in tutto il mondo; il binario sarà molto più grande (~ 1 MB), ovviamente, altri pro/contro?

  4. Posso forzare il linker a collegare il mio binario a una determinata versione di libstdC++?

+2

Si dovrebbe usare 'objdump' per ispezionare la libreria, non' stringhe'. –

risposta

30

Utilizzare readelf -a e objdump -x per esaminare i file ELF in preferenza su strings.

In realtà, tutte le versioni GLIBCXX_ * non si applicano all'intera libreria, ma a ciascun simbolo (versione di simboli, vedere DSO-howto). Quindi puoi avere ad esempio: std::char_traits<wchar_t>::[email protected]@GLIBCXX_3.4.5 e std::ios_base::Init::~Init()@@GLIBCXX_3.4 sullo stesso file di libreria.

Il fatto che il tuo programma abbia bisogno di GLIBCXX_3.4.9 probabilmente significa che è stato collegato a un simbolo che è stato introdotto/ha cambiato la semantica su GLIBCXX_3.4.9.

+0

Uh, questo spiega un sacco di cose, grazie! – peoro

+0

Anche il C++ filt può essere utile se si ha un codice C++. Ad esempio: readelf -aW | C++ filt – jcoffland

0
  1. Che la la versione della libreria che è installato sul vostro sistema. Si potrebbe compilare manualmente la versione 3.4.14 di glibc e collegarsi ad essa
  2. Dipende. Forse la versione successiva ha risolto alcuni problemi. Gli utenti del tuo programma dovrebbero collegarsi alla versione richiesta dal tuo programma
  3. L'utilizzo della memoria è maggiore
  4. Sì, passa il parametro corretto al linker. Se hai bisogno di una versione specifica della libreria, allora è meglio scaricarla, e costruirla manualmente, e collegarla ad essa.

EDIT

ho appena ricordato che le librerie collegate staticamente aumentare l'utilizzo della memoria.

+0

1: Non è così. Riprova. 3: sbagliato. –

+0

@Ignacio Vazquez-Abrams Quindi, ho ottenuto 2 su 4. Per 1), suppongo che manchino le dipendenze per gli glibc. Se 3 non è corretto, credo di vivere nell'ignoranza. Quindi, come correggere questi due? –

+0

1 Non ne sono sicuro, ma la libreria ha 'GLIBCXX_3.4.14' * in essa *, semplicemente non la usa per qualche motivo. Per 3, considera le implicazioni di non essere in grado di aggiornare la libreria. –

-1

A mio parere, se i file binari non utilizzano le nuove funzionalità della nuova versione GLIBCXX, non saranno collegati a tale versione. Quindi i tuoi binari erano collegati con GLBCXX 3.4.9, deve esserci almeno un simbolo esportato da esso e non ci sono simboli esportati dalla versione precedente alla 3.4.9.