15

So che questa domanda è stata posta più volte, ma il mio obiettivo è leggermente diverso rispetto a quello che ho trovato cercando nel web. Nello specifico, sono già in grado di creare una libreria statica per iPhone, ma il file finale che sono in grado di compilare contiene solo arm e architetture i386 (e non sono sicuro di quale braccio si riferisca: è v6 o v7?). Non sono in grado di compilare specificamente per armv6 e armv7 e uniscono entrambe le architetture usando lipo. Lo strumento lipo si lamenta che la stessa architettura (arm, non armv6 o armv7) è presente in entrambe le librerie armv6 e armv7.Come faccio a compilare una libreria statica (grasso) per armv6, armv7 e i386

Qualcuno può spiegare esattamente come costruire per armv6 e armv7 e unire queste librerie in un file grasso usando lipo?

EDIT: Ho bisogno di costruire non usando Xcode ma compilando direttamente una libreria unix tradizionale.

risposta

7

Basta usare libtool per collegare le due versioni arm6 e ARM7 insieme - proprio quello che fa XCode. Tuttavia, si avranno problemi se si tenta di combinare queste librerie statiche in una nuova super-libreria. Se è necessario farlo, leggere this.

Se si sta già facendo questo, ecco perché lipo si lamenta che la tua libreria "armv6" contiene sia armv6 che armv7. Il mio post ha una correzione che sarà probabilmente più semplice per te dal momento che non usi XCode, ma fondamentalmente usi lipo -extract per assicurarti di avere una libreria armv6 sottile e una libreria armv7 sottile prima di andare oltre.

2

Assicurarsi che le impostazioni di generazione siano impostate su Valid Architectures: armv6 armv7 e Architectures: Optimized (armv6 armv7). Ciò dovrebbe risultare in un binario ottimizzato per entrambi v6 & v7. Se non sei sicuro che abbia funzionato, imposta lo Architectures: Standard (armv6) e confronta le dimensioni del file. Ottimizzato dovrebbe produrre il doppio delle dimensioni (quando ricordo bene).

Inoltre è sempre possibile utilizzare lipo -info sul proprio binario per visualizzare tutte le architetture incluse.

esecuzione su una build di distribuzione di mia app mi dà:

ullrich ~/Code/.../build/Distribution-iphoneos/My.app (streaming)$ lipo -info My 
Architectures in the fat file: My are: armv6 armv7 
+0

Scusate, ho dimenticato di dire che ho bisogno di costruire questo non usando Xcode ma compilando direttamente una libreria unix tradizionale. Sto modificando la mia risposta per riflettere questo fatto. –

2

Non sembra esserci la necessità di estrarre dalla libreria di grassi prima di rientrare di nuovo (come descritto nella risposta di Jamie). Sto usando l'SDK 4.0 di Apple, che sembra creare automaticamente le librerie armv6/armv7.

ero in precedenza specificando l'architettura per la lib ingresso in questo modo:

$DEVROOT/usr/bin/lipo -arch arm $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a 

fallisce sulle SDK successive, ma rimuovendo l'architettura dalla (ora grasso) braccio lib funziona bene:

$DEVROOT/usr/bin/lipo $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a 

Lipo deve ora essere in grado di rilevare le architetture nelle librerie di grasso.

10

Ecco una buona soluzione che ho trovato: Static Libs With Support to iOS 5 and Arm64

Modificato:

La soluzione è quella di costruire architetture differenti separati poi li legano con lipo, utilizzando riga di comando (o Rakefile).

prima costruire il file binario con il braccio utilizzando xcodebuild:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='armv7 armv7s' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-arm' BUILT_PRODUCTS_DIR='./build-arm' 

Si noti che è necessario impostare IPHONEOS_DEPLOYMENT_TARGET = '5.0' e archi = 'armv7s ARMv7', si consiglia di impostare costruire e di prodotto dirs per fare le cose più chiaro, date un'occhiata a Build Setting Reference per maggiori dettagli su cosa significhi questo flag.

accumulo successivo di arm64:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='arm64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-arm64' BUILT_PRODUCTS_DIR='./build-arm64' 

nota la differenza su archi e IPHONEOS_DEPLOYMENT_TARGET. Abbiamo anche bisogno di costruire per il simulatore, in questo caso, dobbiamo cambiare l'SDK per iphonesimulator7.0 e costruire in due fasi prima per i386:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='i386' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-i386' BUILT_PRODUCTS_DIR='./build-i386' 

Ora la parte difficile! Se si modifica l'ARCHES in x86_86 in base all'impostazione Xcode, si otterrà un errore del tipo: "x86_64 non è un arco valido". Per evitare questo basta aggiungere VALID_ARCHS = 'x86_64':

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='x86_64' VALID_ARCHS='x86_64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-x86_64' BUILT_PRODUCTS_DIR='./build-x86_64' 

Infine non ci resta che creare un binario di grasso con tutti i 5 architetture:

lipo -create './build-arm/libStaticLibDemo.a' './build-arm64/libStaticLibDemo.a' './build-i386/libStaticLibDemo.a' './build-x86_64/libStaticLibDemo.a' -output 'libStaticLibDemo.a' 

L'autore ha creato un esempio di lavoro di questo, è può ottenere: https://github.com/diogot/StaticLibDemo


ecco il link al post: Static Libs With Support to iOS 5 and Arm64

Tutti i crediti vanno a Diogo Tridapalli.

+0

Grazie per avermelo detto! @kleopatra – Yang

+0

Grazie per i crediti @yang! –