2011-01-17 20 views
8

Tengo algunas preocupaciones de compatibilidad con la creación de una biblioteca C++ con una versión moderna de GCC 4.4.x/4.5.x por la cual los clientes en una versión anterior, digamos 3.4.x/4.1 .X. Una solución que se ha sugerido es compilar los archivos objeto y distribuirlos. Los clientes pueden vincular usando cualquier versión de GCC y la ABI pertinente. Algunas preguntas:Vinculación de archivos de objeto creados con diferentes versiones de GCC

  1. ¿Es esto correcto?
  2. ¿Debo vincular estáticamente para evitar problemas de compatibilidad con libstdC++?
  3. ¿Es innecesario (escuché que gcc 3.4 en adelante es compatible)?

Cheers, Graeme

Respuesta

6

El más seguro sería darles una .so y su correspondiente cabecera con el API binario estable. Para que sea binaria estable, API no debe aceptar ni devolver ningún tipo de std::, como std::string o std::vector<>, ya que el diseño binario de los tipos std:: puede cambiar de una versión a otra.

Y debe estar enlazado estáticamente con libstdC++ (sí, es posible), para que sus clientes no tengan que enlazar con una versión particular de libstdC++.

Habiendo dicho eso, el último cambio ABI de g ++ fue, AFAIK, entre 3.3 y 3.4. A partir de 3.4, los archivos de objeto deberían ser compatibles.

También puede empaquetar todos sus archivos .o en una .a por conveniencia, de modo que cuando agrega un nuevo archivo .o, sus clientes no tienen que actualizar sus archivos make para vincularlos con el nuevo .o.

+0

¿Sabe si ocurre lo mismo con gcc en Solaris? – Graeme

+0

Sí. Lo anterior no es específico del sistema operativo. –

Cuestiones relacionadas