web-dev-qa-db-fra.com

XCode 6.1 Architecture requise manquante X86_64 dans le fichier

En XCode 6.1, je reçois une erreur pour iPhone 6, iPhone 5s (iOS 7.1) qui dit 

    Undefined symbols for architecture x86_64:
      "_OBJC_CLASS_$_ClientAuthenticator", referenced from:
      objc-class-ref in AppDelegate.o
ld: symbol(s) not found for architecture x86_64
linker command failed with exit code 1

Voici ce que j'ai pour la perspective des paramètres d'architecture 

  Architectures : Standard Architectures(armv7, arm64) - $(ARCHES_STANDARD)
  Base SDK : Latest iOS(8.1) 
  Valid Architectures: arm64, armv7, armv7s

  IOS Deployment Target: iOS 6.0

Récemment, j'ai mis à jour mon système d'exploitation vers Yosemite et XCode de 6.0 à 6.1. J'ai cherché sur Stackoverflow pour cette question qui fait référence à XCode 5.1 et essayé toutes les solutions données, mais rien n'a fonctionné. 

Mise à jour - J'ai essayé les modifications suggérées dans la réponse, mais le message d'erreur " Architecture requise manquante X86_64 " persiste. Après un examen plus approfondi, j’ai trouvé que le fichier ClientAuthenticator.o, qui provient de ma bibliothèque, n’était pas construit pour l’architecture X86_64 et c’est probablement le problème? Je cherche comment il peut être construit pour x86_64. 

Ma nouvelle question est quelle est la différence entre arm64 et x86_64 ? Cela ressemble davantage à la différence entre le fabricant d’architecture, mais l’architecture 64 bits de base reste la même.

40
yogsma
  • La première chose à vérifier est que votre bibliothèque statique possède toutes les architectures. Lorsque vous faites un lipo -info myStaticLibrary.a sur un terminal, vous devriez voir les architectures armv7 armv7s i386 x86_64 arm64 pour votre binaire fat.

  • Pour ce faire, je suppose que vous créez un binaire universel - ajoutez ce qui suit à vos paramètres d'architecture de projet de bibliothèque statique -

enter image description here

  • Ainsi, vous pouvez voir que je dois définir manuellement le Standard architectures (including 64-bit) (armv7, armv7s, arm64) du projet de bibliothèque statique.

enter image description here

  • Alternativement, puisque le $ARCHS_STANDARD normal comprend maintenant 64 bits. Vous pouvez également faire $(ARCHS_STANDARD) et armv7s. Vérifiez lipo -info sans elle et vous découvrirez les architectures manquantes. Voici la capture d'écran pour toutes les architectures -

enter image description here

  • Pour votre implémentation de référence (projet utilisant une bibliothèque statique). Les paramètres par défaut devraient fonctionner correctement -

    enter image description here

Mise à jour du 12/03/14(Les architectures standard Xcode 6 excluent les armv7.} _

Donc, armv7s n'est pas nécessaire? Oui. Il semble que les différences générales entre les jeux d’instructions armv7 et armv7 soient mineures. Donc, si vous choisissez de ne pas inclure armv7, le code machine armv7 ciblé fonctionne toujours bien sur les périphériques A6 32 bits, et pratiquement aucun ne remarquera un écart de performances. La source

S'il existe une méthode plus intelligente pour Xcode 6.1+ (iOS 8.1 et versions ultérieures), veuillez la partager.

51
raurora

Si vous construisez une bibliothèque universelle et devez prendre en charge le simulateur (x86_64), construisez le cadre pour toutes les plateformes en définissant Build Active Architecture Only sur No.enter image description here

22
David Douglas

Beaucoup utilisent les scripts de construction trouvés soit ici: http://www.raywenderlich.com/41377/creating-a-static-library-in-ios-tutorial ou ici: https://Gist.github.com/sponno/7228256 pour leur script d'exécution dans leur cible.

Je me tirais les cheveux en essayant d'ajouter x86_64, i386, armv7s, armv7 et arm64 à la section Architectures, uniquement pour trouver lipo -info targetname.a et ne jamais renvoyer ces architectures après une construction réussie.

Dans mon cas, j'ai dû modifier le runcript cible, en particulier l'étape 1 du lien Gist, pour inclure manuellement les architectures à l'aide de -Arch.

Step 1. Build Device and Simulator versions xcodebuild -target ${PROJECT_NAME} ONLY_ACTIVE_Arch=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" xcodebuild -target ${PROJECT_NAME} -configuration ${CONFIGURATION} -sdk iphonesimulator -Arch x86_64 -Arch i386 -Arch armv7 -Arch armv7s -Arch arm64 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

11
joelc

Voici une réponse à votre dernière question sur la différence entre x86_64 et arm64:

  • L'architecture x86_64 est requise pour l'exécution du simulateur 64 bits. 

  • L'architecture arm64 est requise pour utiliser le périphérique 64 bits (iPhone 5s, iPhone 6, iPhone 6 Plus, iPad Air, iPad mini avec écran Retina ).

8
boro

Je rencontre exactement le même problème et je suivais ce tutoriel https://github.com/jverkoey/iOS-Framework#faq

Ce travail a été effectué après avoir inséré les scripts dans la phase de construction de votre agrégat. Avant de compiler, assurez-vous de le compiler à l'aide d'un simulateur iphone (j'ai utilisé iPhone6) au lieu de IOS.

qui me donnera 2 tranches: armv7 et x86_64, puis faites-le glisser dans un nouveau projet fonctionne bien pour moi.

4
user3919423

Après avoir apporté les modifications nécessaires, changez l’architecture en armv7 et supprimez les autres: -

 Change you have to make

0
shubham mishra

Définir les architectures actives de la construction uniquement sur Non a résolu ce problème pour moi.  enter image description here

0

Une autre chose à surveiller est que XCode gère mal les importations de bibliothèque et que, dans de nombreux cas, la solution consiste à rechercher le fichier importé dans votre projet, à le supprimer dans le Finder ou à partir de la ligne de commande, puis à le rajouter. ne sera pas correctement mis à jour par XCode. En conservant l'ancien fichier, XCode continue de tourner en rond sans comprendre pourquoi il ne compile pas, manque l'architecture, etc.

0
BPH

Ma solution consistait à connecter mon iPhone 6, à le construire et au bon déroulement du projet.

Parce que je construisais pour iPhone 6 Simulator.

0
JD - DC TECH

Si vous rencontrez ce problème dans des projets réactifs avec l'une des bibliothèques externes. Vous devez supprimer le projet et utiliser à nouveau react-native link <package-name>. Cela devrait résoudre le problème.

0
Seraj Ahmad

J'utilise la commande lipo pour combiner manuellement deux bibliothèques statiques construites.

EX: J'ai une bibliothèque statique (libXYZ.a) à construire.

Je lance la construction pour Generic iOS Device et le produit est en Debug-iphoneos/

$ lipo -info Debug-iphoneos/libXYZ.a
Architectures in the fat file: Debug-iphoneos/libXYZ.a are: armv7 arm64

Ensuite, je lance la construction pour tout iOS Simulator et le produit est en Debug-iphonesimulator/

$ lipo -info Debug-iphonesimulator/libXYZ.a
Architectures in the fat file: Debug-iphonesimulator/libXYZ.a are: i386 x86_64

Enfin, je combine en une pour contenir toutes les architectures.

$ lipo -create Debug-iphoneos/libXYZ.a Debug-iphonesimulator/libXYZ.a -output libXYZ.a
$ lipo -info libXYZ.a
Architectures in the fat file: libXYZ.a are: armv7 i386 x86_64 arm64
0
allen huang