web-dev-qa-db-fra.com

Xcode 6.1: le fichier a été construit pour x86_64 qui n'est pas l'architecture liée (i386)

J'ai créé un projet de framework Swift pour util/extensions qui compile et copie un .framework fichier vers un emplacement dédié sur mon système. Je veux pouvoir inclure ce fichier dans d'autres projets (Build Phases/Link Binary with Libraries). Le projet de framework est un projet de type Cocoa Touch Framework (tel que sélectionné dans le navigateur de modèles de projet Xcode 6.1).

Mais lorsque j'essaie de compiler un projet qui relie le fichier de framework, j'obtiens cet avertissement:

ld: avertissement: ignorer le fichier /Users/name/Projects/Xcode/Libs/swiftutils.framework/swiftutils, le fichier a été créé pour x86_64 qui n'est pas l'architecture en cours de liaison (i386):/Users/name/Projects/Xcode/Libs/swiftutils.framework/swiftutils

Y a-t-il quelque chose que je puisse faire avec le projet de framework pour qu'il soit valable pour d'autres projets iOS? C'est déroutant parce que le projet-cadre est un projet Cocoa Touch Framework qui devrait naturellement fonctionner avec d'autres projets Cocoa Touch (c'est-à-dire IOS), n'est-ce pas?

39
BadmintonCat

Assurez-vous que vous avez i386 et x86_64 répertorié dans vos architectures dans les paramètres de construction de votre bibliothèque. Définissez également Build Active Architecture Only explicitement sur No.

33
dogsgod

Bien que la réponse acceptée ait résolu le problème, voici un peu plus car le problème concerne l'architecture, littéralement les fichiers binaires

1. Architecture dans iOS

armv64: iPhoneX, iPhone 5s-8, iPad Air - iPad Pro

armv7: iPhone3Gs-5c, iPad WIFI (4e génération)

armv6: iPhone - iPhone3G

ce qui précède si pour de vrais appareils

i386: simulateur 32 bits

x86_64: simulateur 64 bits

la liste ci-dessus est compatible vers le bas, ce qui signifie que l'iPhoneX peut également fonctionner avec armv6 et ne peut tout simplement pas utiliser pleinement les fonctions d'armv64

plus d'informations sur les architectures iOS peuvent être trouvées ici: https://developer.Apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html

2. Qu'est-ce que Build Active Architecture Only?

S'il est sélectionné "Oui", il ne construira votre framework que sur le "périphérique sélectionné", soit des périphériques réels (armv) ou un simulateur (x86_64 ou i386). Pour "Non", il construira votre framework à votre liste de "Architectures valides"

Par défaut, en mode débogage, c'est "Oui"; et dans la version plus, c'est "Non", ce qui peut gagner du temps de compilation en mode débogage et garantir que votre framework de projet de version fonctionne sur toutes les architectures que vous avez spécifiées.

C'est pourquoi la réponse acceptée a fonctionné en forçant le framework à se construire pour toutes les architectures, cependant en lisant plus vous saurez ce qui se cache et vous pourrez certainement gagner du temps dans la compilation de votre framework. Bien sûr, plus de contrôle en vous aussi.

Donc, si vous travaillez sur un framework, et que vous souhaitez importer dans un autre projet, si vous compilez le framework avec Build Active Architecture Only "Yes" with simulateur (i386 ou x86_64) , puis importez dans votre projet avec Créer une architecture active uniquement "Oui" avec un vrai appareil (armv) , vous rencontrerez cette erreur.

En regardant la description de l'erreur:

le fichier a été construit pour x86_64 qui n'est pas l'architecture liée ( i386 ) impliquera que vous construisez votre framework dans un simulateur 64 bits et votre projet fusionné avec un simulateur 32 bits.

alors qu'un plus commun serait:

le fichier de framework a été construit pour x86_64 qui n'est pas l'architecture liée ( arm64 ): ce qui implique que votre framework est construit dans le simulateur tandis que votre projet fusionné est construit avec un appareil réel.

3. Extraire le framework

Une pratique courante serait de cliquer avec le bouton droit sur le framework et de sélectionner Afficher dans le Finder , tandis que la plupart des développeurs conservent le Finder ouvert, et le nouveau framework compilé remplacera l'ancien, sans fermer Finder et rouvrira à nouveau. Oui, c'est vrai, mais si vous avez changé le périphérique cible de construction entre les deux, les frameworks entraîneront différents dossiers . Parfois, vous pensez que vous avez compilé votre framework mais en fait il se trouve dans un autre dossier. Mes suggestions seraient toujours de sélectionner Afficher dans le Finder pour éviter que le framework que vous importez ne soit pas le plus récent.

Les deux dossiers différents: Debug-iphoneos et Debug-iphonesimulator - enter image description hereenter image description here

9
Edison Lo

J'ai rencontré ce problème et la solution actuelle s'est débarrassée de l'erreur d'origine (c'est-à-dire impossible de lier i386), mais les cadres liés (comme Alamofire) n'ont pas pu être importés dans mon projet. La solution suivante a résolu ce problème.

  1. Dans votre cible Build Settings -> Architectures -> Valid Architectures, ajoutez la valeur i386.

build settings

  1. Ensuite, supprimez le contenu du dossier de données dérivé de votre projet. Le contenu de ce dossier est généré pendant la construction et peut être supprimé en toute sécurité et Xcode en créera un nouveau. Pour supprimer ce dossier dans Xcode 8, accédez à File-> Project/Workspace Settings, cliquez sur la flèche grise pour ouvrir l'emplacement du dossier dans le Finder et supprimez le contenu. derived data folder location

  2. Nettoyez et reconstruisez.

  3. Si la génération échoue toujours, recherchez dans le navigateur de problème quelque chose qui dit Update to recommended settings. Cliquez dessus et réessayez.
    Si vous ne voyez pas cette option, modifiez Build Active Architecture Only à Yes dans les paramètres de construction. Cela ralentit les temps de construction, ce qui peut être frustrant lors du passage fréquent entre différents appareils, mais cela peut être nécessaire.

8
darksinge

J'ai également constaté que si vous utilisez des cadres via des cocoapods comme je l'étais, je devais aller au projet Pods et appliquer des solutions de @dogsgod et @darksinge pour chaque cible de cadre dans le projet Pods. Autrement dit, j'ai dû désactiver la génération pour les architectures actives uniquement et ajouter X86_64 et i386 dans les architectures valides.

2
Jitendra Kulkarni

J'ai eu exactement la même erreur pour une autre raison. La version de déploiement iOS pour l'application principale était 10.0 et 11.0 sur le framework. Comme 11.0 n'autorise que 64 bits, le cadre a été compilé pour 64 bits uniquement. Et lorsque l'application a voulu se connecter au framework en 32 bits, j'ai eu cet avertissement:

file was built for arm64 which is not the architecture being linked (armv7)

Suivi d'une erreur de l'éditeur de liens car bien sûr, beaucoup de symboles du cadre manquant n'ont pas été trouvés.

Donc, changer la cible de déploiement en iOS 10.0 sur le framework l'a corrigé. Changer la cible de déploiement de l'application en iOS 11.0 le corrigerait probablement aussi (en générant un binaire 64 bits uniquement).

0
jptsetung

La mise à niveau de React Native 57.8 vers 58.4 a introduit ce problème de l'éditeur de liens. Ce n'était pas une erreur de framework cependant. Les méthodes ci-dessus ne fonctionnaient pas, mais ce qui m'a corrigé était la suppression de la section Test des cibles dans xCode . Je n'en avais pas besoin, cela nous convenait. Par exemple, le projet SuperCool a des OBJECTIFS: SuperCool, SuperCoolTests, SuperCool-tvOS et SuperCool-tvOSTests. Supprimez SuperCoolTests à corriger.

0
Kevin Pham