2011-01-02 4 views
26

Tengo un conjunto de bibliotecas estáticas de iPhone (un archivo * .a) en el que solo llamo algunas de las clases desde. He usado AR en el pasado (con bibliotecas de Linux) para extraer los archivos objeto de la biblioteca estática, eliminar los archivos de objetos no deseados y volver a generar.Extraer archivos de objetos (* .o) de una biblioteca estática de iPhone

Sin embargo, cuando intento esto con una biblioteca estática iPhone compliled, me sale el siguiente error:

ar: CustomiPhoneLib.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it) 
ar: CustomiPhoneLib.a: Inappropriate file type or format 

¿Alguien sabe cómo extraer los archivos objeto desde un iPhone compilado biblioteca estática? Hacer esto podría reducir el tamaño del archivo final.

Respuesta

40

Eso es porque CustomiPhoneLib.a es una biblioteca gorda, es decir, una biblioteca que contiene más de una arquitectura de destino, concretamente armv6 y armv7 en iOS. Puede usar lipo para extraer una arquitectura específica en otro archivo .a, use ar y ranlib para manipularla a voluntad, y luego use lipo nuevamente para recombinar los archivos .a manipulados en un solo archivo .a fat. Por ejemplo,

lipo CustomiPhoneLib.a -thin armv6 -output CustomiPhoneLibarmv6.a 
lipo CustomiPhoneLib.a -thin armv7 -output CustomiPhoneLibarmv7.a 
### use ar and ranlib at will on both files 
mv CustomiPhoneLib.a CustomiPhoneLib.a.original 
lipo CustomiPhoneLibarmv6.a CustomiPhoneLibarmv7.a -create -output CustomiPhoneLib.a 

Sin embargo, no tiene que hacer esto por la razón que ha mencionado. El vinculador solo extraerá los archivos de objeto (.o) de una biblioteca (.a) si necesita resolver alguna referencia de símbolo. Por lo tanto, si una biblioteca contiene un archivo de objeto cuyos símbolos nunca se referencian durante el proceso de vinculación (es decir, símbolos que no se utilizan de manera efectiva), ese archivo de objeto no se convertirá en el ejecutable.

+1

¡Esa es la explicación exacta que estaba buscando! ¡Gracias! Parece que no puedo encontrar algo así a través de Google. – Brett

+0

@Bavarious: Objective-C es un lenguaje dinámico y el enlazador no siempre puede decir qué clases y categorías se usan, por lo tanto, eliminar los objetos no deseados en lib es correcto. –

3

Code: ar -t mylib.a Esto mostrará una lista de todos los archivos en el archivo.

Code: ar -xv mylib.a myobj.o Esto extraerá el objeto dar myobj.o de la mylib.a biblioteca.

+3

Esto no funciona para binarios gordos. – fpg1503

+0

¿Qué funcionaría para los binarios de grasa también? – davidhq

+0

Lo resolvió, tuvo que extraer primero: 'lipo -thin x86_64 libtag.a -output libtag2.a', luego' ar tv libtag2.a' funcionó – davidhq

Cuestiones relacionadas