2011-01-02 21 views
26

Ho un set di librerie statiche per iPhone (un file * .a) in cui solo alcune classi vengono chiamate da. Ho usato AR in passato (con le librerie Linux) per estrarre i file oggetto della libreria statica, rimuovere i file oggetto indesiderati e rearchive.Estrai oggetto (* .o) file da una libreria statica di iPhone

Tuttavia, quando provo questo con una libreria statica iPhone compliled, ottengo il seguente errore:

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 

Qualcuno sa come estrarre i file oggetto da un iPhone compilato libreria statica? Ciò potrebbe potenzialmente ridurre la dimensione del file finale.

risposta

40

Questo è perché il vostro CustomiPhoneLib.a è una libreria di grassi, vale a dire, una libreria che contiene più di un'architettura target, vale a dire ARMv6 e ARMv7 su iOS. È possibile utilizzare lipo per estrarre un'architettura specifica in un altro file .a, utilizzare ar e ranlib per modificarlo a piacere, quindi utilizzare nuovamente lipo per ricombinare i file .a manipolati in un unico file .a grasso. Ad esempio,

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 

Tuttavia, non devi farlo per il motivo che hai menzionato. Il linker estrarrà solo i file oggetto (.o) da una libreria (.a) se è necessario risolvere alcuni riferimenti ai simboli. Pertanto, se una libreria contiene un file oggetto i cui simboli non sono mai referenziati durante il processo di collegamento (ad esempio, simboli che non vengono effettivamente utilizzati), quel file oggetto non lo renderà nell'eseguibile.

+1

Questa è la spiegazione esatta che stavo cercando! Grazie! Non riesco a trovare nulla di simile tramite Google. – Brett

+0

@Bavarious: Objective-C è un linguaggio dinamico e il linker non può dire sempre che le classi e categorie vengono utilizzati, quindi, rimuovere gli oggetti indesiderati in lib è ok. –

3

Code: ar -t mylib.a Questo elencherà tutti i file nell'archivio.

Code: ar -xv mylib.a myobj.o Ciò estrarre l'oggetto dare myobj.o dalla mylib.a biblioteca.

+3

Questo non funziona per i file binari grassi. – fpg1503

+0

Cosa funzionerebbe anche per i file binari grassi? – davidhq

+0

capito, ha dovuto estrarre prima: 'lipo-sottile x86_64 libtag.a -output libtag2.a', quindi' ar tv libtag2.a' lavorato – davidhq

Problemi correlati