Comment puis-je xcodebuild une bibliothèque statique avec Bitcode activé?
Xcode 7 introduit Bitcode , qui est une sorte de binaire intermédiaire LLVM qui signifie que les serveurs D'Apple peuvent recompiler mon application pour différentes architectures sans ma participation.
à Lookback, je distribue un framework d'archives statiques avec notre bibliothèque. Il semble que lorsque vous construisez avec autre chose qu'un "Build & Archive", le bitcode n'est pas réellement émis dans ma bibliothèque, et toute personne qui établit un lien avec ma bibliothèque dans son application et essaie de faire un Build & Archive avec Bitcode activé recevra l'un des deux avertissements:
-
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.
(si lib est construit avec 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)
(si lib est construit avec Xcode 7 avec un xcodebuild normal)
j'ai un script de construction qui construit un périphérique+simulateur binaire universel, donc je ne peux pas utiliser Build & Archive, mais plutôt, j'exécute xcodebuild
à partir de la ligne de commande de mon script. Comment puis-je faire xcodebuild
générer une bibliothèque compatible bitcode?
4 réponses
Bitcode est une fonctionnalité de compilation (pas une fonctionnalité de lien-time) qui signifie que chaque .le fichier o doit contenir une section supplémentaire appelée __bitcode lorsqu'il est construit avec bitcode. Vous pouvez confirmer si votre binaire est compatible bitcode en lançant otool -l (my .o or .a file) | grep __LLVM
.
quand vous construisez normalement, Xcode ajoute le drapeau de construction -fembed-bitcode-marker
à n'importe quelle invocation de clang. Cela semble être une sorte de' c'est où bitcode irait, si bitcode était activé ' chose, et ne fait pas réellement activez bitcode.
lorsque vous "construisez et archivez", ce drapeau est remplacé par -fembed-bitcode
, qui construit vraiment un binaire compatible Bitcode.
Il semble y avoir deux façons de faire xcodebuild
utiliser -fembed-bitcode
:
- utilisez l'action" archive", comme dans
xcodebuild -target LookbackSDK archive
au lieu dexcodebuild -target LookbackSDK build
. Cela a l'effet secondaire de mettre des binaires dans votre organisateur Xcode au lieu du dossierbuild/
, bien que vous puissiez travaillez autour de cela en utilisant-exportArchive -archivePath ./build
(merci @JensAyton ) - forcer l'usage du drapeau en ajoutant D'autres drapeaux C avec
OTHER_CFLAGS="-fembed-bitcode"
. Votre invocationxcodebuild
ressemblerait à quelque chose commexcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build
.
ce dernier est ce que j'ai choisi pour ne pas avoir à changer mon système de construction, mais il générera des avertissements pour chaque fichier, puisque maintenant les deux -fembed-bitcode-marker
et -fembed-bitcode
sont envoyés à clang. Heureusement l' ce dernier gagne, générant une bibliothèque compatible Bitcode!
ressources
avec Xcode 8, Je ne pouvais pas faire fonctionner OTHER_CFLAGS="-fembed-bitcode"
. J'ai continué à courir dans quelque chose le long des lignes de was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build
quand j'ai essayé de créer une archive construire d'une application contenant mon cadre statique.
ce que je cherchais vraiment était ceci:
BITCODE_GENERATION_MODE=bitcode
j'utilise en fait un Script D'exécution à l'intérieur d'une cible agrégée, la ligne complète xcodebuild ressemble à ceci (juste pour référence):
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
une fois que vous aurez ajouté le support de bitcode pour la lib statique, il ne sera plus compatible avec Xcode 6. L'application ne sont pas des archives.
je voudrais mentionner clairement le réglage du bitcode car la réponse de @nevyn m'a un peu déconcerté.
aller à Paramètres de construction, rechercher"drapeaux de compilateur personnalisé". Ajouter -fembed-bitcode
. Cela construira votre lib avec bitcode.
choisir un projet Sur les paramètres de Construction - > autres drapeaux C, mettez Debug à-fembed-bitcode-marker et Release à-fembed-bitcode
sur les paramètres de construction, cliquez sur le signe + en haut pour ajouter un paramètre de construction défini par l'utilisateur avec le nom BITCODE_GENERATION_MODE, et définissez Debug à marker, Release à bitcode
modifier le schéma en tant que version Ensuite se lécher la bibliothèque.un fichier et obtenir le chemin de compilation obtenez le dossier de sortie du formulaire de la bibliothèque