/usr/lib/libstdc++.so.6: versión `GLIBCXX_3.4.15 'no encontrada

135

¿Cómo puedo obtener GLIBCXX_3.4.15 en Ubuntu? No puedo ejecutar algunos programas que estoy compilando.

Cuando lo hago:

strings /usr/lib/libstdc++.so.6 | grep GLIBC

Yo obtengo:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.4
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

¡Gracias por cualquier ayuda!

Chris
fuente

Respuestas:

81

Estoy compilando gcc 4.6 de la fuente, y aparentemente

sudo make install 

No entendí este. Cavé y encontré

gcc/trunk/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.15

Lo copié en / usr / lib y redirigí libstdc ++. So.6 para que apunte al nuevo, y ahora todo funciona.

Chris
fuente
1
Tengo el mismo problema, y ​​esta publicación / respuesta es exactamente lo que estoy buscando. ¡Muchas gracias!
Yoco
1
Esto funciona con gcc 4.6.2 también, excepto que es libstdc ++. So.6.0.16. ¡Gracias!
Venesectrix
2
El mío es gcc 4.7 y libstdc ++. So.6.0.17. Tuve el mismo problema, solucionado con esta solución. Prestigio.
Ricbit
1
Sí hay. Una apt-getsolución basada a este problema se describe aquí: superuser.com/questions/310809/...
aroth
44
@roosevelt: no es un problema con el sistema operativo, es un problema con los usuarios que instalan el software ellos mismos y luego no usan el enlazador correctamente. Es una pregunta frecuente: gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely
54

He estado evitando este problema en el pasado simplemente vinculando libstdc ++ estáticamente con este parámetro enviado a g ++ al vincular mi ejecutable:

-static-libstdc++

Si vincular estáticamente en la biblioteca es una opción, esta es probablemente la solución más rápida.

Martin G
fuente
2
Muchas gracias, probé cualquier otra solución sugerida en SO y nada funcionó excepto esta.
Itamar Katz
1
Gracias por su solución, ¡me ayuda mucho!
Brightshine
El problema es que no se puede encontrar la biblioteca, no es que debas vincular estáticamente. Vea la respuesta de @Hobo.
Dan Mergens el
45

Estaba tratando de hacer que el sonido metálico funcionara (que también requiere 6.0.15), y mientras hurgaba, encontré que estaba instalado en /usr/local/lib/libstdc++.so.6.0.15. Se instaló allí cuando instalé grafito (una versión experimental de gcc).

Si necesita acceso a bibliotecas en esa ubicación, deberá definirlo LD_LIBRARY_PATHcomo:

export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/usr/local/lib64:/usr/lib64

Pude hacer que el sonido metálico funcionara después de hacer esto. Espero que sea útil para alguien.

Obrero temporal
fuente
Estaba trabajando en un objetivo incrustado y tengo el mismo problema, su solución parece no funcionar en mi caso. De hecho, la mayoría del binario en el destino utiliza la biblioteca c predeterminada en / lib, por lo que el cambio LD_LIBRARY_PATHlos afectará. todos se vincularán a la nueva biblioteca. Al final, la mayoría de los archivos binarios no funcionan: por ejemplo ls grep, ...: ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
Estoy
14

Me encuentro con este problema cuando intento usar matlab eng para llamar a funciones m desde el código c. que ocurre con el comandomex -f .. ..

Mi solución:

strings /usr/lib/i386-<tab>/libstdc++.so.6 | grep GLIBC

Encontré que incluye 3.4.15

entonces mi sistema tiene las bibliotecas más nuevas.

el problema proviene de matlab, llama a su propio libstdc ++. so.6 de {MATLAB}/bin

entonces, simplemente reemplácelo con la versión actualizada del sistema lib.

Cheng Chang
fuente
Esto también parece funcionar para mí en Matlab 2013b x64 en Xubuntu 13.04 x64
Marcin
Muchas gracias. Solo tenía que crear un nuevo enlace simbólico para el archivo en {MATLAB}/binel archivo /usr/lib/y luego reiniciar matlab. Esto funciona en Matlab 2010b en Fedora 14 x64.
Wok
2

Tengo el mismo error Así es como funcionó para mí:

  • limpiado el proyecto bajo gcc actualmente instalado
  • recompilado

Funcionó perfectamente!

iueae
fuente
2

Para este error, copié el último libstdc ++. So.6.0.17 de otro servidor, eliminé el enlace flexible y lo recreé.

1. Copie libstdc ++. So.6.0.15 o la versión más reciente de otro servidor al sistema afectado.
En mi caso, SUSE linux 11 SP3 tuvo la última versión.
2. rm libstdc ++. So.6
3. ln -s libstdc ++. So.6.0.17 libstdc ++. So.6 (bajo el directorio / usr / lib64).

nJoy

crazyLinux
fuente
2

Acabo de enfrentar un problema similar al construir la versión LLVM 3.7. primero verifique si ha instalado la biblioteca requerida en su sistema:

$locate libstdc++.so.6.*

Luego agregue la ubicación encontrada a su variable de entorno $ LD_LIBRARY_PATH.

Arsen
fuente
2
Esto solo funciona si tiene un libstdc ++. So.6. * Lib con soporte
GLIBCXX_3.4.15
2

A veces no controlas la máquina de destino (por ejemplo, tu biblioteca necesita ejecutarse en un sistema empresarial bloqueado). En tal caso, deberá volver a compilar su código utilizando la versión de GCC que corresponde a su versión GLIBCXX. En ese caso, puede hacer lo siguiente:

  1. Busque la última versión de GLIBCXX compatible con la máquina de destino: strings /usr/lib/libstdc++.so.6 | grep GLIBC... Digamos que la versión es 3.4.19.
  2. Use https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html para encontrar la versión de GCC correspondiente. En nuestro caso, esto es [4.8.3, 4.9.0).
Gili
fuente
1

gcc versión 4.8.1, el error parece ser:

/ root / bllvm / build / Release + Asserts / bin / llvm-tblgen: /usr/lib64/libstdc++.so.6: versión 'GLIBCXX_3.4.15' no encontrada (requerida por / root / bllvm / build / Release + Asserts / bin / llvm-tblgen)

Encontré el libstdc ++. So.6.0.18 en el lugar donde cumplí con gcc 4.8.1

Entonces me gusta esto

cp ~/objdir/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.18 /usr/lib64/

rm /usr/lib64/libstdc++.so.6

ln -s libstdc++.so.6.0.18 libstdc++.so.6

problema resuelto.

Favoorr
fuente
1

Los extraje de un RPM ( RPM para libstdc ++ ) y luego:

export LD_LIBRARY_PATH=.

Para configurar el sistema para buscar las bibliotecas en el directorio actual. Luego solo ejecuté mi programa. Pero en mi caso recibí un solo ejecutable que necesitaba, no fue un cambio en todo el sistema.

prmottajr
fuente
0

Tuve un problema similar y lo resolví mediante la vinculación estática libstdc++al programa que estaba compilando, así:

$ LIBS=-lstdc++ ./configure ... etc.

en lugar de lo habitual

$ ./configure ... etc.

Puede haber problemas con esta solución relacionada con la carga de bibliotecas compartidas en tiempo de ejecución, pero no he investigado el problema lo suficiente como para comentar.

Evgeni Sergeev
fuente
0

Tuve el mismo problema porque cambié el usuario de mí mismo a otra persona:

su

Por alguna razón, después de la compilación normal, no pude ejecutarla (el mismo mensaje de error). Directamente ssh a la otra cuenta de usuario funciona.

Hola Mundo
fuente
Esto realmente no responde la pregunta. Si tiene una pregunta diferente, puede hacerla haciendo clic en Hacer pregunta . También puede agregar una recompensa para llamar más la atención sobre esta pregunta.
ravron
No, porque tengo exactamente el mismo problema. Fue causado por el cambio de usuario. También podría haberle sucedido a otra persona, por ejemplo, cambiar a root.
HelloWorld
¡Mi error! Me arrojó la primera línea, que parecía que tú también tenías el problema. ¡Continua!
ravron
También usé Ubuntu y también intenté compilar programas y también recibí el mismo mensaje de error que en la pregunta. Mi error fue que lo estaba haciendo en otra cuenta de usuario usando el comando su. Creo que esto responde la pregunta porque aborda por qué y qué hay del problema. Ciertamente es una posibilidad.
HelloWorld
¿Y un usuario tenía LD_LIBRARY_PATH configurado para encontrar la nueva lib pero no el otro usuario? Eso parece un poco descabellado en el contexto específico de esta pregunta.
Marc Glisse
0

Tenía instaladas varias versiones del compilador gcc y necesitaba usar una versión más reciente que la instalación predeterminada. Como no soy administrador del sistema para nuestros sistemas Linux, no puedo simplemente cambiar / usr / lib o muchas de las otras sugerencias anteriores. Me encontraba con este problema y finalmente lo rastreé hasta establecer mi ruta al directorio de la biblioteca de 32 bits en lugar del directorio de la biblioteca de 64 bits (lib64). Dado que las bibliotecas en el directorio de 32 bits eran incompatibles, el sistema usó la versión anterior que estaba desactualizada.

El uso de -L en la ruta a la que hacía referencia daba advertencias sobre "omitir libstdc ++ incompatible. Así que al buscar -lstdc ++". Esta fue la pista que finalmente me ayudó a resolver el problema.

Cathy
fuente
0

Lo mismo con la versión gcc 4.8.1 (GCC)y libstdc++.so.6.0.18. Tuve que copiarlo aquí /usr/lib/x86_64-linux-gnuen mi cuadro de ubuntu.

ervinbosenbacher
fuente
0

En mi caso, LD_LIBRARY_PATH tenía / usr / lib64 primero antes de / usr / local / lib64. (Estaba construyendo llvm 3.9).
El nuevo compilador gcc que instalé para compilar llvm 3.9 tenía bibliotecas que usaban bibliotecas GLIBCXX más nuevas en / usr / local / lib64. Así que arreglé LD_LIBRARY_PATH para que el enlazador vea primero / usr / local / lib64.
Eso resolvió este problema.

Chan Kim
fuente
0

Acabo de usar -static-libstdc ++ mientras construía. w / that, puedo ejecutar el a.out

g++ test.cpp -static-libstdc++
Suresh
fuente
0

Para fines de prueba:

En la máquina original, busque la biblioteca, copie en el mismo directorio que el ejecutable:

$ ldconfig -p | grep libstdc
        libstdc++.so.6 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (libc6) => /usr/lib32/libstdc++.so.6
$ cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 .

Luego copie esta misma biblioteca en la máquina de destino y ejecute el ejecutable:

LD_LIBRARY_PATH=. ./myexecutable

Nota: el comando anterior es temporal; No es un cambio en todo el sistema.

Aplazamiento de pago
fuente