2011-11-17 33 views
36

Probé el enfoque en este question, pero parece que la versión de Linux de ar no es la misma que la versión de mac ya que no pude combinar los archivos objeto nuevamente.Combinar bibliotecas estáticas

Lo que básicamente quiero hacer es fusionar otra biblioteca estática en mi producto de compilación de biblioteca estática de Xcode a través de una fase de compilación de run-script.

Desafortunadamente no puedo compilar la otra biblioteca directamente en mi proyecto porque tiene su propio sistema de compilación (por lo tanto, uso las comps compiladas).

Creo que debería ser posible fusionar la otra biblioteca a través de ar en la biblioteca generada de Xcode sin descompilar el producto de compilación. ¿Cómo logro esto?

Respuesta

62

puede utilizar libtool hacerlo

libtool -static -o new.a old1.a old2.a 
+2

Esta es en realidad una solución mejor que 'ar'. ¡Gracias! –

+0

¿Dónde puedo ejecutar esto? –

+0

cualquier línea de comando (bash), deberías tener libtool en PATH siempre que tengas la extensión de los desarrolladores. Alternativamente, como un paso de compilación posterior en xcode. – Bruce

0

Debería ser capaz de vincular uno con el otro. Entonces ... solo use ld para fusionar las imágenes.

0

Debe utilizar ar -r para crear un archivo en MacOS:

ar -x libabc.a 
ar -x libxyz.a 
ar -r libaz.a *.o 
+0

Esto no funciona en absoluto. Va a sobrescribir los archivos que tienen los mismos nombres .o. –

3

Si usted está tratando con bibliotecas estáticas multi-arquitectura, un poco de manipulación adicional es necesario para diluir cada biblioteca, combinar las versiones diluidas y luego engordar el resultado. Aquí hay un guión útil que puede editar a su gusto, que hace todo eso en uno. El ejemplo toma tres bibliotecas iOS path/to/source/libs/libone.a, path/to/source/libs/libtwo.a y path/to/source/libs/libthree.a y las fusiona en una sola biblioteca libcombined.a.

#! /bin/bash 

INPATH="path/to/source/libs" 

LIBPREFIX="lib" 
LIBS="one two three" 
LIBEXT=".a" 

OUT="combined" 

ARCHS="armv7 armv7s arm64" 

for arch in $ARCHS 
do 
    for lib in $LIBS 
    do 
    lipo -extract $arch $INPATH/$LIBPREFIX$lib$LIBEXT -o $LIBPREFIX$lib-$arch$LIBEXT 
    done 
    INLIBS=`eval echo $LIBPREFIX\{${LIBS// /,}\}-$arch$LIBEXT` 
    libtool -static -o $LIBPREFIX$OUT-$arch$LIBEXT $INLIBS 
    rm $INLIBS 
done 

OUTLIBS=`eval echo $LIBPREFIX$OUT-\{${ARCHS// /,}\}$LIBEXT` 
lipo -create $OUTLIBS -o $LIBPREFIX$OUT$LIBEXT 
rm $OUTLIBS 
Cuestiones relacionadas