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.
Chez Lookback, je distribue un framework d'archive statique 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 quiconque se connecte avec ma bibliothèque dans son application et essaie de faire un Build & Archive avec Bitcode activé obtiendra 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 binaire universel appareil + simulateur, donc je ne peux pas utiliser Build & Archive, mais plutôt, je lance à xcodebuild
partir de la ligne de commande à partir de mon script. Comment puis-je xcodebuild
générer une bibliothèque compatible avec le bitcode?
Réponses:
Bitcode est une fonctionnalité de compilation (pas une fonctionnalité de liaison) ce qui signifie que chaque fichier .o doit contenir une section supplémentaire appelée __bitcode lorsqu'il est construit avec bitcode. Vous pouvez vérifier si votre binaire est compatible avec le bitcode en exécutant
otool -l (my .o or .a file) | grep __LLVM
.Lorsque vous construisez normalement, Xcode ajoute l'indicateur de construction
-fembed-bitcode-marker
à tout appel de clang. Cela semble être une sorte de chose 'c'est là que le bitcode irait, si le bitcode était activé', et n'active pas réellement le bitcode.Lorsque vous "Construire et archiver", cet indicateur est remplacé par
-fembed-bitcode
, ce qui crée vraiment un binaire compatible Bitcode.Il semble y avoir deux façons d'
xcodebuild
utiliser-fembed-bitcode
:xcodebuild -target LookbackSDK archive
au lieu dexcodebuild -target LookbackSDK build
. Cela a pour effet secondaire de placer des binaires dans votre organisateur Xcode au lieu dubuild/
dossier, bien que vous puissiez contourner cela en utilisant-exportArchive -archivePath ./build
(merci @JensAyton )OTHER_CFLAGS="-fembed-bitcode"
. Votrexcodebuild
invocation 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, ce dernier gagne, générant une bibliothèque compatible Bitcode!Ressources
la source
-fembed-bitcode-marker
être ignoré en ajoutant-Qunused-arguments
également.otool -l myfile.o | grep __LLVM
, car il y aura un segment __bitcode même s'il n'y a qu'un marqueur de bitcode au lieu d'un vrai bitcode.Avec Xcode 8, je ne pouvais pas me rendre
OTHER_CFLAGS="-fembed-bitcode"
au travail. J'ai continué à rencontrer quelque chose du genrewas built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build
lorsque j'ai essayé de créer une version d'archive d'une application contenant mon framework statique.Ce que je cherchais vraiment, c'était ceci:
BITCODE_GENERATION_MODE=bitcode
J'utilise en fait un Run Script à l'intérieur d'une cible agrégée, la ligne xcodebuild complète 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
la source
BITCODE_GENERATION_MODE=bitcode
méthode semble être préférée, comme suggéré dans cette réponse également.Une fois que vous avez ajouté la prise en charge du bitcode pour la bibliothèque statique, elle ne sera plus compatible avec Xcode 6. L'application ne sera pas archivée.
Je voudrais mentionner clairement le réglage du bitcode car la réponse de @ nevyn m'a un peu dérouté.
Allez dans les paramètres de construction, recherchez «indicateurs de compilateur personnalisés». Ajouter
-fembed-bitcode
. Cela construira votre bibliothèque avec bitcode.la source
Sélectionnez le projet Sur les paramètres de construction -> Autres indicateurs C, définissez Debug sur -fembed-bitcode-marker et Release sur -fembed-bitcode
Sur 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 sur marqueur, Release sur bitcode
Modifier le schéma en tant que version Cliquez ensuite sur la bibliothèque souhaitée. Un fichier et obtenez le chemin de construction. Obtenez le dossier Release du formulaire de bibliothèque.
la source