2010-01-18 44 views
24

Después de instalar una nueva máquina de construcción, descubrí que venía con 6.0.10 de la ++ biblioteca estándar CEnlace con una versión anterior de libstdC++

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

Muchos de nuestros equipos de destino, sin embargo, todavía utilizar un mayor versión de libstdC++, por ejemplo:

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

al parecer, el ABI cambió en los dos últimos 0.0.1 de, como tratando de ejecutar un programa de resultados en

/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ó. La actualización de 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 libstdC++ anterior?

He buscado en apt-cache para versiones anteriores de libstdC++ para instalar, pero aparentemente no hay versiones anteriores de 6 disponibles?

Respuesta

18

No es necesario que establezca un enlace a una biblioteca diferente, debe utilizar una versión anterior del compilador.

Eche un vistazo a the GNU ABI policy. La biblioteca compartida libstdC++ está diseñada para ser compatible con versiones anteriores. Es decir. la versión 6.0.10 se puede usar si necesita 6.0.8. En la política puede leer eso 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 estándar g ++ (cambie el nombre del enlace, elimine el paquete que lo proporciona, sáquelo de PATH) y comienza a cavar Trabajó para mi.

+0

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

+0

@Peter Sí, tome una versión anterior de g ++ que enlaza con la versión anterior de libstdC++. Así que – Jan

+10

Creo que es bastante cojo que para usar una versión anterior de la biblioteca C++ tenga que vivir con un compilador que potencialmente tenga errores y optimizaciones que faltan, especialmente porque a la inversa (usando un compilador antiguo con una nueva versión de biblioteca) parece que solo se trata de establecer 'LD_LIBRARY_PATH'. –

6

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

El envío de la versión específica que necesita significa que no importará qué versión ha instalado el usuario. Solo debe asegurarse de enviar todas las dependencias también.

1

Ya lo he encontrado. No pensé en nada mejor que instalar un sistema (¿virtualizado?) Con la misma configuración que las máquinas de destino para construir los binarios distribuibles.

+1

si bien esto es ciertamente una opción, esto parece tanto trabajo para simplemente vincularlo con una biblioteca más antigua ... Espero que se publiquen algunas opciones mejores para ser honestos :) – Pieter

+0

Otra opción es instalar la misma versión de la biblioteca stdC++ que está presente en el sistema de destino. Pero como no está presente por defecto en su distribución, tendrá que hacerlo manualmente. Esto no será trivial, y te darás dolores de cabeza reales haciendo que la versión 2 coexista en tu sistema. Configurar la distribución anterior y compilarla es de un par de horas (si no usa tantas bibliotecas exóticas), y realmente vale la pena compararla con la segunda versión manual de la configuración de la biblioteca. –

+0

No necesita instalar un sistema completo; simplemente configure una segunda cadena de herramientas como si estuviese compilando de forma cruzada, pero apuntando a su propia plataforma. – ephemient

1

Al alternativa, que no funcionó para mí, pero tal vez alguien más lo encuentre útil, es vincular estáticamente libgcc y libstdC++.

gcc tiene una opción -static-libgcc, pero el simple hecho de usar esta opción no logra nada, ya que libstdC++ aún está vinculado dinámicamente. Pero al asegurarse de que gcc solo puede encontrar la versión estática de libstdC++, se puede lograr un enlace estático.

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

problema es que las bibliotecas del refuerzo, se construyó en contra de la nueva libstdC++, así que mientras el programa se compila correctamente, genera errores de ejecución ...

Tal vez esto es soluble si reconstruyo impulso también, paraíso' T intentó eso.

(para el registro, si se utiliza cualquier código que carga dinámicamente las bibliotecas, a través por ejemplo dlopen, estáticamente vinculación es todo fuera de la cuestión)

+0

Simplemente tiene que usar -static-libstdC++ y no necesita la magia de enlace simbólico. – Kaa

2

Puede "contrabando" el más reciente libstdC++ en los sistemas cliente (en un área privada) y vincule los programas con -rpath, o puede obtener una versión anterior de libstdC++ en su computadora. No parece que necesite la actualización, y puede estar fuera de dudas por otros motivos 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 propia libstC++). Intenta instalar una versión más antigua (que coincida con los sistemas cliente) de gcc, podría llevar la libstdC++ más antigua que estás buscando.

0

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

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

libstdC++ no se puede incluir de esta manera. Hay una opción static-libC++, pero generalmente no es lo que quieres. – phord

Cuestiones relacionadas