2009-05-19 10 views
6

Estoy trabajando en redhat 5.2 en un proyecto que abarca varias organizaciones diferentes. Cada organización ofrece bibliotecas que se han compilado con varias versiones de g ++. Actualmente, estas versiones incluyen 4.1.1, 4.1.2 y 4.3.1. Estoy tratando de vincular todas las bibliotecas en un ejecutable utilizando 4.1.2. ¿Qué problemas puedo esperar al hacer esto? Como un aparte, ¿hay alguna manera de decir a qué ABI se construye cada versión del compilador?Mezclar bibliotecas de diferentes compiladores de C++

+0

Al principio pensé que te referías a Red Hat 5.2 (Apollo), que tiene más de diez años. :) – bk1e

Respuesta

1

Tal vez es más fácil de enlace estático el ejecutable ... hace un gran binario, pero se ejecuta en todas las plataformas.

6

Este documento de política ABI detalla la compatibilidad entre las diferentes versiones de ABI. Según eso, la biblioteca libstdc++.so debería ser compatible, y la última vez que gcc rompió la compatibilidad binaria estaba en 3.4. Deberías estar bien.

0

No debería haber problemas para vincular bibliotecas creadas a partir de versiones diferentes de g ++ a menos que se hayan enumerado en el sitio web g ++. Sin embargo, lo importante es que estas bibliotecas se construyan en la misma plataforma que en su caso es redhat 5.2. Una biblioteca creada para una plataforma que no sea linux/redhat (digamos Solaris) no se vinculará con su exe.

0

IIRC, hay una biblioteca de compatibilidad C++ que se utiliza para hacer precisamente eso. Creo que se llama libstdC++ - compat.

+0

No puede vincular objetos que dependen de diferentes versiones de stdlibC++. – ephemient

5

GCC (Colección compilador GNU) define los números de versión y la compatibilidad.

Las bibliotecas G ++ entre 4.1.1 y 4.1.2 deben ser compatibles; enlace con el más nuevo.

Las librerías G ++ entre 4.1.x y 4.2.x no son compatibles; necesitas recompilar algo

Las librerías G ++ entre 3.x.y y 4.p.q no son compatibles; necesitas recompilar algo

En su escenario, el código creado con 4.3.1 no es compatible con el resto.

O tendrá que reconstruir el código actualmente compilado con 4.3.x, por lo que usa 4.1.x, o necesita recompilar el código actualmente compilado con 4.1.x, por lo que usa 4.3.x en su lugar.

+0

Esa es la teoría, pero en la práctica el último cambio de ABI fue 3.4 –

+0

@Edu: pero en cualquier momento en el futuro, podría haber un cambio que invoca esa regla, y las personas que se han vuelto descuidadas pueden estar en una sorpresa (tener que recompilar). –

Cuestiones relacionadas