2011-08-22 19 views
7

cuando compilo un programa en C++ en mi equipo con g ++ y transferir el archivo ejecutable para ejecutarlo en mi servidor de la universidad, me salelibstdC++ GLIBCXX errores de versión

./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./main) 
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./main) 
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./main) 

El programa se ejecuta bien en mi equipo, y don No tengo privilegios para instalar ningún software nuevo en los servidores de mi universidad.

¿Alguna ayuda? Gracias

+0

¿Cuál es la versión de libstdC++ en la universidad? – phoxis

+0

@phoxis, 3.4.8 o anterior, parece. – bdonlan

Respuesta

7

Parece que está usando la biblioteca estándar como una biblioteca compartida (comportamiento predeterminado) al vincular su programa en casa.

De modo que en lugar de realmente "vincular" la biblioteca, el vinculador simplemente resuelve algunos símbolos y realiza otra operación, mientras que retrasa la carga real de la biblioteca en tiempo de ejecución.

Cuando ejecuta su programa en la computadora de su universidad, el cargador (el programa que realmente carga su programa en la memoria y arroja el hilo principal) busca las bibliotecas que su programa necesita e intenta cargarlas (busque LD_LIBRARY_PATH en Linux si sientes curiosidad).

El problema aquí es que está vinculando su programa en el hogar con una versión de stdlib que no es la misma versión que la que tiene en la universidad. Entonces, cuando el cargador intenta encontrar la biblioteca, falla, y entonces su programa no se puede ejecutar.

Soluciones:

a) Para evitar todos estos problemas utilizan estática que une en lugar de enlace dinámico. No estoy seguro de si esto es posible con stdlib, pero creo que vale la pena probarlo (vea: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html y busque el indicador "-estático")

b) Puede intentar compilar su programa en la computadora de su universidad entonces usará la versión allí.

c) Intente saber qué versión de stdlib está instalada allí e instale la misma versión en su compilador.

d) Puede intentar copiar la versión de su casa de stdlib a la misma carpeta que su aplicación.Esto generalmente funciona porque el cargador tiende a buscar bibliotecas compartidas en la carpeta de la aplicación actual antes de buscar en la ruta establecida en la variable de entorno LD_LIBRARY_PATH (linux)

Espero que ayude.

P.S .: Aquí tienes una buena introducción a la electricidad estática vs compartidos bibliotecas/dinámicos http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html

y aquí (http://en.wikipedia.org/wiki/Library_%28computing%29) un no tan agradable, pero más completa descripción de la biblioteca.

+1

Una mejor opción que '-static' sería' -static-libstdC++ 'que solo vincula libstdC++ estáticamente, no el programa completo. –

4

La versión de libstdc++.so.6 es demasiado antigua en la computadora de la universidad. Tiene dos opciones:

  1. Estáticamente enlace con -static. La biblioteca C++ se fusionará en el binario final.
  2. Copie la versión correcta en algún lugar de su directorio personal, luego hágalo pasando -rpath /path/to/library/directory en tiempo de compilación, o establezca la variable de entorno LD_LIBRARY_PATH para que apunte al directorio que contiene el libstdc++.so.6 más reciente.
+0

muchas gracias bdonian, ¿el enlace estático hace que el programa se ejecute más lento cuando se ejecuta en los servidores de la universidad? – Tarek

+0

@Tarek, la vinculación estática tiene varios pros y contras, pero no creo que veas mucha diferencia de velocidad, realmente. – bdonlan

+0

como @bdonian dijo que hay muchos pros y contras, pero en su caso el principal será el tamaño. Un programa enlazado estáticamente es más grande que el enlazado dinámicamente porque en el enlace estático las bibliotecas están "incluidas" dentro del ejecutable. – thamurath

1

¿Para qué plataformas está intentando compilar? es decir, 'su computadora' y sus 'servidores de la Universidad'?

Puede intentar compilar su programa con la opción de enlace estático. Esto generará un ejecutable enlazado estáticamente con todas las dependencias lib ya cargadas.

Saludos,

3

Puede copiar su versión de la /usr/lib/libstdc++.so.6 a un subdirectorio del directorio principal del servidor, por ejemplo ~/lib y luego ejecutar:

$ LD_LIBRARY_PATH=$HOME/lib ./main 

O si lo prefiere

$ export LD_LIBRARY_PATH=$HOME/lib 
$ ./main 

Y el programa debería cargar su biblioteca privada en lugar del sistema uno.

Cuestiones relacionadas