Come posso xcodebuild una libreria statica con Bitcode abilitato?


89

Xcode 7 introduce Bitcode , che è una sorta di binario intermedio LLVM che significa che i server Apple possono ricompilare la mia app per diverse architetture senza il mio coinvolgimento.

A Lookback, distribuisco un framework di archivio statico con la nostra libreria. Sembra che quando crei qualcosa di diverso da "Build & Archive", il bitcode non viene effettivamente emesso nella mia libreria e chiunque si colleghi alla mia libreria nella propria app e provi a fare un Build & Archive con Bitcode abilitato ne otterrà uno di due avvertenze:

  • ld: 'Lookback(Lookback.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. (se lib è compilato con Xcode 6)
  • ld: warning: full bitcode bundle could not be generated because 'Lookback(Lookback.o)' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE) (se lib è compilato con Xcode 7 con un normale xcodebuild)

Ho uno script di compilazione che crea un binario universale di dispositivo + simulatore, quindi non posso usare Build & Archive, ma piuttosto xcodebuildeseguo dalla riga di comando dal mio script. Come posso xcodebuildcreare una libreria abilitata per bitcode adeguata?


HI @nevyn Sto cercando di compilare il tuo SDK in un'app che utilizza bitcode. C'è un modo?
Stoff81

@ Stoff81 Scusa, ci sto lavorando. Devo prima far funzionare tutte le mie dipendenze con Bitcode, ed è un bel po 'di lavoro.
nevyn

Risposte:


137

Bitcode è una funzionalità in fase di compilazione (non una funzionalità in fase di collegamento), il che significa che ogni file .o dovrebbe contenere una sezione aggiuntiva chiamata __bitcode quando viene creato con bitcode. Puoi confermare se il tuo binario è compatibile con bitcode eseguendo otool -l (my .o or .a file) | grep __LLVM.

Quando si compila normalmente, Xcode aggiunge il flag di build -fembed-bitcode-markera qualsiasi chiamata clang. Questo sembra essere una sorta di "questo è dove andrebbe il bitcode, se il bitcode fosse abilitato", e in realtà non abilita il bitcode.

Quando "Compila e archivia", questo flag viene sostituito da -fembed-bitcode, che crea davvero un binario abilitato per Bitcode.

Sembra che ci siano due modi per xcodebuildutilizzarlo -fembed-bitcode:

  • Usa l'azione "archivia", come in xcodebuild -target LookbackSDK archiveinvece di xcodebuild -target LookbackSDK build. Questo ha l'effetto collaterale di mettere i binari nel tuo Xcode Organizer invece della build/cartella, anche se puoi aggirare questo usando -exportArchive -archivePath ./build(grazie @JensAyton )
  • Forza l'utilizzo del flag aggiungendo altri flag C con OTHER_CFLAGS="-fembed-bitcode". La tua xcodebuildinvocazione sarebbe simile a xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build.

Quest'ultimo è quello che ho scelto in modo da non dover cambiare il mio sistema di compilazione, ma genererà avvisi per ogni file, poiché ora entrambi -fembed-bitcode-markere -fembed-bitcodevengono inviati a clang. Fortunatamente quest'ultimo vince, generando una libreria abilitata per Bitcode!

Risorse


9
FWIW, puoi eliminare l'avviso di -fembed-bitcode-markeressere ignorato anche aggiungendo -Qunused-arguments.
mstorsjo

quale exportFormat usi per un xcodebuild di un framework? Solo "ipa", "pkg" e "app" sembrano essere definiti ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ).
Fabian Köbel

@nevyn Non è stato ancora possibile creare la mia app principale che ha il file di framework personalizzato che a sua volta contiene uno script di build con il flag sopra menzionato.
ravoorinandan

otool -l (il mio file .o o .a). Vuoi dire otool -l (il mio file .o o .a) | grep __bitcode?
Mike M

1
@MikeM no in realtà otool -l myfile.o | grep __LLVM, perché ci sarà un segmento __bitcode anche se c'è solo un indicatore di bitcode al posto del bitcode reale.
nevyn

41

Con Xcode 8, non riuscivo a mettermi OTHER_CFLAGS="-fembed-bitcode"al lavoro. Ho continuato a imbattermi in qualcosa sulla falsariga di was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install buildquando ho provato a creare una build Archive di un'app contenente il mio framework statico.

Quello che stavo davvero cercando era questo:

BITCODE_GENERATION_MODE=bitcode

In realtà sto usando uno script di esecuzione all'interno di un target aggregato, l'intera riga xcodebuild è simile a questa (solo per riferimento):

xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build


2
+1, il BITCODE_GENERATION_MODE=bitcodemetodo sembra essere preferito, come suggerito anche in questa risposta .
William Denniss

Questo ha anche risolto il mio problema mentre la risposta predefinita non lo è più.
Kamchatka

Salvavita! Grazie!
vidalbenjoe

17

Una volta aggiunto il supporto bitcode per la libreria statica, non sarà compatibile con Xcode 6. L'app non verrà archiviata.

Vorrei menzionare chiaramente l'impostazione per bitcode poiché la risposta di @ nevyn mi ha un po 'confuso.

Vai a Impostazioni build, cerca "flag del compilatore personalizzato". Aggiungi -fembed-bitcode. Questo costruirà la tua libreria con bitcode.


6

Seleziona il progetto in Impostazioni build -> Altri flag C, imposta Debug su -fembed-bitcode-marker e Release su -fembed-bitcode

In Impostazioni build, fai clic sul segno + in alto per aggiungere un'impostazione di build definita dall'utente con il nome BITCODE_GENERATION_MODE e imposta Debug su marcatore, Rilascia su bitcode

Modifica schema come Rilascio Quindi fare clic sulla libreria desiderata. Un file e ottieni il percorso di compilazione. Ottieni la cartella di rilascio del modulo di libreria.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.