2012-04-27 23 views

Respuesta

6

Se puede usar en combinación con g++ --versionthe GCC ABI docs para averiguar.

49

Para saber qué biblioteca se está utilizando podría ejecutar

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

La lista de las versiones compatibles para libstdC++ versión 3.4.0 y superior es proporcionada por

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

Para versiones anteriores del símbolo GLIBCPP se define.

La marca de fecha de la biblioteca se define en una macro __GLIBCXX__ o __GLIBCPP__ dependiendo de la versión:

// 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 tabla de marcas de fecha de versiones libstdC++ aparece en la documentation:

+8

Las marcas de fecha están casi totalmente inútil, no sé por qué ellos o documentación molestamos mantener ellos. Por ejemplo, la fecha para GCC 4.6.3 es posterior a 4.7.0, pero 4.7.0 tiene más características, entonces ¿para qué sirve saber la fecha en que fue lanzado? –

14

El mecanismo I tienden a usar una combinación de readelf -V para volcar la información .gnu.version de libstdC++, y luego una tabla de búsqueda que coincide con el valor más grande GLIBCXX_ extraído.

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

si su versión de sort es demasiado viejo para tener la opción -V (que ordena por número de versión), entonces usted puede utilizar:

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

en lugar de la sort -u -V, para ordenar por hasta 4 dígitos de la versión.

En general, coincidir con la versión ABI debería ser lo suficientemente bueno.

Si usted está tratando de localizar a la libstdc++.so.<VERSION>, sin embargo, se puede utilizar un poco de fiesta como:

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

así que para mi sistema esto produjo 6.0.10.

Sin embargo, si usted está tratando de conseguir un binario que fue compilado en systemx para trabajar en SYSTÉMY, entonces este tipo de cosas van solamente a llegar tan lejos. En esos casos, llevando consigo una copia de la libstdC++ por lo que se utilizó para la aplicación, y luego tener una secuencia de comandos de ejecución que hace un:.

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

generalmente trabaja en torno al tema de la .so que está en el cuadro siendo incompatible con la versión de la aplicación. Para diferencias más extremas en el entorno, tiendo a simplemente agregar todas las bibliotecas dependientes hasta que la aplicación funcione correctamente. Este es el equivalente de Linux de trabajar alrededor de lo que, para windows, se consideraría dll hell.

+0

¿Puedes usar 'ident' o' what' en el archivo de la biblioteca para encontrar información de la versión incrustada? –

+0

'ident' hace el equivalente suelto de un' cadenas- | grep '\ $. * \ $' ',' what' utiliza el equivalente de 'cadenas- | fgrep '@ (#)' ', ninguno de los cuales determina la información de versión de la biblioteca subyacente si esas cadenas no están compiladas. Confiar en la información de ABI tiene mucho más sentido si está tratando de determinar la compatibilidad, ya que generalmente hervidos en la construcción, mientras que ident/what strings tienden a ser omitidos – Petesh

10

¿Qué es exactamente lo que quiere saber?

¿El soname de la biblioteca compartida? Eso es parte del nombre de archivo, libstdc++.so.6, o se muestra por readelf -d /usr/lib64/libstdc++.so.6 | grep soname.

¿El número de revisión menor? Usted debe ser capaz de conseguir que simplemente comprobando lo que los puntos de enlace simbólico 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 

Eso te dice que es 6.0.16, que es la versión 16 de la versión libstdc++.so.6, que corresponde a los GLIBCXX_3.4.16 versiones de símbolos.

¿O te refieres a la versión de la que proviene? Es parte de GCC por lo que es la misma versión que GCC, por lo menos que la has cagado su sistema mediante la instalación de versiones no coincidentes de g++ y libstdc++.so se puede conseguir eso de:

$ g++ -dumpversion 
4.6.3 

O bien, en la mayoría de distribuciones, puede solo pregúntale al administrador del paquete. En mi anfitrión Fedora eso es

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

Como otras respuestas han dicho, puede asignar las emisiones a versiones de las bibliotecas mediante la comprobación the ABI docs

Cuestiones relacionadas