web-dev-qa-db-fra.com

Bibliothèque iOS en BitCode

J'ai récemment téléchargé la version bêta de Xcode 7 et Xcode se plaint de l'absence de compilation de certaines de mes bibliothèques C dans BitCode. Comment pourrais-je dire à Clang de produire du BitCode compatible avec iOS? J'ai vu des réponses similaires sur stackoverflow, mais je ne sais pas si elles s'appliquent à la production de bibliothèques BitCode pour iOS.

Modifier:

J'utilise le paramètre correct, -fembed-bitcode, mais lorsque j'essaie d'archiver, le message d'erreur suivant s'affiche: ld: warning: en ignorant le fichier XXXX/XXXX, le fichier a été créé pour une archive qui n'est pas l'architecture reliée (arm64). Lorsque j'utilise -fembed-bitcode-marker, je peux archiver, mais le message d'erreur suivant s'affiche: le groupe de codes-bits complet n'a pas pu être généré car XX/XX a été construit uniquement avec un marqueur de code-bits. La bibliothèque doit être générée à partir de la compilation d'archives Xcode avec bitcode activé.

Des idées sur ce qui ne va pas? La bibliothèque compile avec succès, mais elle ne me permet pas d’archiver. J'ai créé une fonction d'ajout simple et l'ai transformée en une bibliothèque et j'ai les mêmes symptômes, donc ce n'est pas la bibliothèque que je compile.

Edit 2: Vous devez créer les versions arm64 et armv7 en utilisant bitcode et lipo ensemble. L'utilisation de bitcode ne supprime pas le besoin d'une grosse bibliothèque lors de l'archivage. source: https://forums.developer.Apple.com/message/25132#25132

47
stack_tom

Lors de la construction de bibliothèques statiques, vous devez ajouter les éléments suivants pour la génération de code binaire:

-fembed-bitcode 

pour une bibliothèque dynamique, vous devez également créer un lien avec

-fembed-bitcode

Remarque: cette commande est uniquement disponible avec Xcode7 +.

En ce qui concerne la réponse acceptée d'utiliser -fembed-bitcode-marker

Sachez qu'une construction normale avec l'option -fembed-bitcode-marker produira des sections de bitcode incorporées de taille minimale sans contenu réel. Ceci est fait comme un moyen de tester les aspects de votre construction liés au bitcode sans ralentir le processus de construction. Le contenu actuel du bitcode est inclus lorsque vous créez une archive.

bwilson Apple Personnel. https://forums.developer.Apple.com/thread/3971#12225


Pour être plus précis:

  • -fembed-bitcode-marker marque simplement où le bitcode serait dans le binaire après la construction de l’archive.
  • -fembed-bitcode effectue en fait la génération et l’incorporation de codes bits complets, c’est donc ce que vous devez utiliser pour créer des bibliothèques statiques.
  • Xcode lui-même construit avec -fembed-bitcode-marker pour les constructions régulières (comme déployer sur simulateur)
  • Xcode ne construit qu'avec -fembed-bitcode pour les versions d'archive/de production (car cela n'est nécessaire que pour Apple).
62
Danoli3

Allez les Paramètres de construction . Recherchez "drapeaux de compilation personnalisés ".
Ajouter -fembed-bitcode to Autres drapeaux C . Cela garantira que la bibliothèque est construite avec une compatibilité bitcode lors de la compilation. Je l'ai conçu pour iOS 64 bits et 32 ​​bits et je les ai combinés en un. Fonctionne comme un charme.

Puisque vous avez posé des questions, voici une capture d'écran des paramètres: Les paramètres sont les mêmes pour la cible du projet et la cible du SDK.

enter image description here


La bibliothèque de code binaire ne fonctionnera pas avec Xcode 6.

50
Gautam Jain

Si vous rencontrez toujours des problèmes après avoir ajouté le -fembed-bitcode aux indicateurs Other C, recherchez "Enable Bitcode" sous "Options de construction" et réglez-le sur Non. Cela vous permettra d'archiver correctement.

26
Ian Han

Ce dont vous avez besoin est -fembed-bitcode. Lorsque ENABLE_BITCODE est activé, Xcode construit avec -fembed-bitcode-marker pour les générations standard et -fembed-bitcode pour les générations d'archive. Une option consiste simplement à "marquer" où le bitcode serait dans le binaire après une construction d'archive et à appliquer les nouvelles règles, alors que l'autre effectue la génération complète de bitcode, ce qui est probablement plus lent et n'est donc pas activé pour tous les types de construction. .

Le guide d'utilisation de BITCODE de Syo Ikeda peut également vous aider:

Vous pouvez trouver le jeu de diapositives complet ici.

15
Xeieshan

Si vous construisez une bibliothèque statique et souhaitez activer le code binaire, le (1) ENABLE_BITCODE = YES peut ne pas suffire.

(2) Également avec le réglage -fembed-bitcode L’erreur ci-dessous était toujours générée pour plusieurs fichiers lorsqu’elle était intégrée à Teamcity

bitcode bundle could not be generated because ‘/path/fileInYourStaticLib.a(fileInYourStaticLib.o)’ was built without full bitcode. All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture arm64

Quelques astuces/points à prendre en compte qui m'ont aidé à résoudre finalement le problème, en plus des étapes ci-dessus (1) et (2)

  1. Assurez-vous de définir la variable 'Other C Flags' sur "-fembed-bitcode" dans le champ "PROJECT" et dans tous les "TARGETS".

  2. Si vous essayez de créer une bibliothèque statique pour plusieurs projets, assurez-vous que tous les projets ont "-fembed-bitcode" activée.

  3. On Build Settings, click on the + sign at the top to add a user-defined build setting with the nameBITCODE_GENERATION_MODE, and set Debug tomarqueur, Release tobitcode

  4. Si les étapes ci-dessus ne fonctionnent pas, vous pouvez également essayer cette option. On Build Settings -> Other C flags, set Debug to- fembed-bitcode-marker, and Release to- fembed-bitcode

Ce blog a été d'une grande aide https://medium.com/@heitorburger/static-libraries-frameworks-and-bitcode-6d8f784478a9

De plus, chaque fois que vous apportez les modifications ci-dessus, essayez de supprimer DerivedData, Nettoyez le projet XCode et éventuellement quittez et redémarrez XCode.

10
Naishta