2012-04-27 16 views

risposta

6

È possibile utilizzare g++ --version in combinazione con the GCC ABI docs per scoprirlo.

49

per trovare quale biblioteca è in uso è possibile eseguire

$ /sbin/ldconfig -p | grep stdc++ 
    libstdc++.so.6 (libc6) => /usr/lib/libstdc++.so.6 

L'elenco delle versioni compatibili per libstdC++ versione 3.4.0 e, soprattutto, è fornito da

$ strings /usr/lib/libstdc++.so.6 | grep LIBCXX 
GLIBCXX_3.4 
GLIBCXX_3.4.1 
GLIBCXX_3.4.2 
... 

Per le versioni precedenti del simbolo GLIBCPP è definito.

Il timbro della data della biblioteca è definito in una macro __GLIBCXX__ o __GLIBCPP__ a seconda della versione:

// libdatestamp.cxx 
#include <cstdio> 

int main(int argc, char* argv[]){ 
#ifdef __GLIBCPP__ 
    std::printf("GLIBCPP: %d\n",__GLIBCPP__); 
#endif 
#ifdef __GLIBCXX__ 
    std::printf("GLIBCXX: %d\n",__GLIBCXX__); 
#endif 
    return 0; 
} 

$ g++ libdatestamp.cxx -o libdatestamp 
$ ./libdatestamp 
GLIBCXX: 20101208 

La tabella di datestamps delle versioni libstdC++ è elencata nella documentation:

+8

I datestamps sono quasi del tutto inutile, non so il motivo per cui loro o documentazione preoccuparci di mantenere loro. Ad esempio, la data per GCC 4.6.3 è successiva alla 4.7.0, ma 4.7.0 ha più funzionalità, quindi quale uso è conoscere la data di rilascio? –

14

Il meccanismo che tendono ad utilizzare una combinazione di readelf -V per scaricare le informazioni .gnu.version da libstdC++ e quindi una tabella di ricerca che corrisponde al valore GLIBCXX_ più grande estratto.

readelf -sV /usr/lib/libstdc++.so.6 | sed -n 's/.*@@GLIBCXX_//p' | sort -u -V | tail -1 

se la versione di sort è troppo vecchio per avere la possibilità -V (che ordina in base al numero di versione) quindi è possibile utilizzare:

tr '.' ' ' | sort -nu -t ' ' -k 1 -k 2 -k 3 -k 4 | tr ' ' '.' 

al posto del sort -u -V, per ordinare per fino a 4 cifre della versione.

In generale, la corrispondenza della versione ABI dovrebbe essere sufficiente.

Se si sta cercando di rintracciare il libstdc++.so.<VERSION>, però, si può usare un po 'come bash:

file=/usr/lib/libstdc++.so.6 
while [ -h $file ]; do file=$(ls -l $file | sed -n 's/.*-> //p'); done 
echo ${file#*.so.} 

così per il mio sistema di questo prodotto 6.0.10.

Se, tuttavia, si sta tentando di ottenere un file binario compilato su systemX per funzionare su systemY, allora questo tipo di cose ti porterà solo lontano. In questi casi, portando con sé una copia del libstdC++ in modo che è stato utilizzato per l'applicazione, e poi avere uno script percorso che fa un:.

export LD_LIBRARY_PATH=<directory of stashed libstdc++.so> 
exec application.bin "[email protected]" 

lavora generalmente intorno alla questione del .so che si trova sul casella incompatibile con la versione dell'applicazione. Per le differenze più estreme in ambiente, tendo ad aggiungere tutte le librerie dipendenti finché l'applicazione non funziona correttamente. Questo è l'equivalente di Linux di aggirare ciò che, per Windows, sarebbe considerato dll hell.

+0

Puoi usare 'ident' o' what' sul file della libreria per trovare informazioni sulla versione integrata? –

+0

'ident' ha l'equivalente libero di un' stringhe -a | grep '\ $. * \ $' ',' what' usa l'equivalente di 'stringhe -a | fgrep '@ (#)' ', nessuno dei quali determina le informazioni sulla versione della libreria sottostante se quelle stringhe non sono compilate. Basarsi sulle informazioni ABI ha molto più senso se si sta cercando di determinare la compatibilità, in quanto è generalmente bollito nella build, mentre ident/quali stringhe hanno la tendenza ad essere omessi – Petesh

10

Che cosa vuoi sapere esattamente?

Il soname della libreria condivisa? Fa parte del nome file, libstdc++.so.6 o mostrato da readelf -d /usr/lib64/libstdc++.so.6 | grep soname.

Il numero di revisione secondario? Si dovrebbe essere in grado di ottenere che semplicemente controllando ciò che i link simbolico punta a:

$ ls -l /usr/lib/libstdc++.so.6 
lrwxrwxrwx. 1 root root 19 Mar 23 09:43 /usr/lib/libstdc++.so.6 -> libstdc++.so.6.0.16 

Che ti dice che è 6.0.16, che è il 16 ° di revisione della versione libstdc++.so.6, che corrisponde alle versioni GLIBCXX_3.4.16 simbolo.

O intendi l'uscita? Fa parte del GCC in modo che sia la stessa versione di GCC, quindi a meno che non hai avvitato il vostro sistema installando le versioni senza precedenti di g++ e libstdc++.so si può ottenere che dal:

$ g++ -dumpversion 
4.6.3 

Oppure, sulla maggior parte delle distribuzioni, è possibile basta chiedere al manager del pacchetto. Sul mio ospite Fedora che è

$ rpm -q libstdc++ 
libstdc++-4.6.3-2.fc16.x86_64 
libstdc++-4.6.3-2.fc16.i686 

Come altre risposte hanno detto, è possibile mappare rilasci versioni di libreria controllando the ABI docs

Problemi correlati