Enlace con una versión anterior de libstdc++

4 minutos de lectura

Avatar de usuario de Pieter
Pedro

Después de instalar una nueva máquina de compilación, descubrí que venía con 6.0.10 de la biblioteca estándar de C++

-rw-r--r--  1 root root 1019216 2009-01-02 12:15 libstdc++.so.6.0.10

Sin embargo, muchas de nuestras máquinas de destino todavía usan una versión anterior de libstdc++, por ejemplo:

-rwxr-xr-x 1 root root  985888 Aug 19 21:14 libstdc++.so.6.0.8

Aparentemente, el ABI cambió en esos dos últimos 0.0.1, ya que intentar ejecutar un programa da como resultado

/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found

Intenté instalar explícitamente una versión anterior de gcc pero eso no ayudó. Actualizar las máquinas de destino está fuera de mi control, por lo que no es una opción. ¿Cuál es la mejor manera de hacer que mis compilaciones funcionen en máquinas con una versión anterior de libstdc++?

Busqué en apt-cache versiones anteriores de libstdc++ para instalar, pero aparentemente no hay versiones anteriores de 6 disponibles.

No necesita vincular a una biblioteca diferente, necesita usar una versión anterior del compilador.

Mira esto la política GNU ABI. La biblioteca compartida libstdc++ está diseñada para ser compatible con versiones anteriores. Es decir, se puede usar la versión 6.0.10 si necesita 6.0.8. En la política puede leer que desde gcc-4.2.0 en adelante, se necesita 6.0.9, por lo que necesita un gcc-4.1.x.

En resumen, es por eso que solo hay una libstdc++.so.6.0.x en su sistema, solo necesita la última.

En cuanto a configurar su sistema de compilación para usar solo una versión específica del compilador: asegúrese de que no se pueda usar el g ++ estándar (cambie el nombre del enlace, elimine el paquete que lo proporciona, sáquelo de PATH) y comience a cavar. Trabajó para mi.

  • ¿Quiere decir que tenemos que instalar una versión anterior de g ++?

    – Pedro Lee

    8 de julio de 2011 a las 3:49

  • @Peter Sí, tome una versión anterior de g ++ que se vincule a la versión anterior de libstdc ++.

    – Ene

    8 de julio de 2011 a las 11:50

  • Creo que es bastante tonto que para usar una versión anterior de la biblioteca de C ++ tenga que vivir con un compilador que potencialmente tiene errores y optimizaciones faltantes, especialmente porque aparece al revés (usando un compilador antiguo con una nueva versión de biblioteca) ser solo una cuestión de configuración LD_LIBRARY_PATH.

    – Frerich Raabe

    25 de septiembre de 2013 a las 12:42


Puede enviar las bibliotecas compartidas requeridas con su propio código (en un subdirectorio, por ejemplo) y configurar LD_LIBRARY_PATH, como un precursor para ejecutar su aplicación, para buscar primero en ese directorio.

Enviar la versión específica que necesita significará que no importará qué versión haya instalado el usuario. Solo tiene que asegurarse de enviar todas las dependencias también.

Una alternativa, que no funcionó para mí, pero tal vez a alguien más le resulte útil, es vincular estáticamente libgcc y libstdc++.

gcc tiene una opción -static-libgcc, pero el simple uso de esta opción no logra nada, ya que libstdc++ todavía está vinculado dinámicamente. Pero al asegurarse de que gcc solo pueda encontrar la versión estática de libstdc++, se puede lograr la vinculación estática.

ln -s `g++ -print-file-name=libstdc++.a`
g++ -static-libgcc -L. source.cpp

El problema es que las bibliotecas boost se crearon con la nueva libstdc++, por lo que mientras el programa se compila correctamente, genera errores de tiempo de ejecución…

Tal vez esto se pueda solucionar si reconstruyo boost también, no lo he intentado.

(para que conste, si usa algún código que cargue bibliotecas dinámicamente, por ejemplo, a través de dlopenla vinculación estática está fuera de discusión)

  • Simplemente tiene que usar -static-libstdc++ y no necesita la magia del enlace simbólico.

    – Kaa

    29 de diciembre de 2017 a las 0:44

Ya encontré esto. No se me ocurrió nada mejor que instalar un sistema (¿virtualizado?) con la misma configuración que las máquinas de destino para construir los binarios distribuibles.

Puede “pasar de contrabando” la nueva libstdc++ a los sistemas cliente (a un área privada) y vincular los programas con los -rpath, o puede obtener una versión anterior de libstdc++ en su computadora. no se parece a ti necesitar la actualización, y puede estar fuera de discusión por otras razones de todos modos.

Nota: en FreeBSD, libstdc++ está acoplado con el compilador (tengo gcc4.2, 4.4 y 4.5 instalados, cada uno con su propio libstc++). Intente instalar una versión anterior (que coincida con los sistemas cliente) de gcc, podría tener la versión anterior de libstdc++ que está buscando.

Avatar de usuario de Rodrigo
Rodrigo

Trabaja para mí: establece estas banderas:

-Wl,-Bstatic -lstdc++ -Wl,-Bdynamic -Wl,-Bstatic -lgcc -Wl,-Bdynamic -static

Si pongo solo -static-libstdc++ -static no me funciona.

Avatar de usuario de Tom
Tomás

¿Has intentado simplemente ponerlo con la lista de fuentes? ¡Esto supone que realmente tiene la biblioteca instalada!

g++ /usr/lib/libstdc++.so.6.0.8 source1.cpp source2.cpp

  • libstdc++ no se puede incluir de esta manera. Hay una opción static-libc++, pero normalmente no es lo que quieres.

    – Phil Hord

    23 de febrero de 2012 a las 22:26

¿Ha sido útil esta solución?