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?

70
demandé sur user102008 2015-07-18 02:37:34

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 de xcodebuild -target LookbackSDK build . Cela a l'effet secondaire de mettre des binaires dans votre organisateur Xcode au lieu du dossier build/ , 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 invocation xcodebuild ressemblerait à quelque chose comme xcodebuild 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

116
répondu nevyn 2017-05-23 12:18:25

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

17
répondu Aaron Ash 2017-09-08 18:40:20

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.

16
répondu Gautam Jain 2015-09-15 10:11:35

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

1
répondu Oshitha Wimalasuriya 2018-08-15 04:47:48