web-dev-qa-db-fra.com

le fichier a été construit pour une archive qui n'est pas l'architecture en cours de liaison (i386)

Je dois construire une bibliothèque statique. Je veux utiliser dans mon application iPhone et iPad. Lorsque j'essaie de lancer le simulateur, des erreurs de lien sont créées. Je suis nouveau dans le développement iOS. aide aimablement;

ld: avertissement: ignorer le fichier /Users/valuelabs/Desktop/DruvaProject/libraries/libnetUtils.a, fichier a été construit pour une archive qui n’est pas l’architecture liée (i386) Symboles non définis pour l'architecture i386:
"_OBJC_CLASS _ $ _ netUtils", référencé depuis: objc-class-ref dans ViewController.o ld: symbole (s) introuvable pour l'architecture i386 clang: erreur: la commande de l'éditeur de liens a échoué avec le code de sortie 1 (utilisez -v pour voir l'invocation)

J'ai essayé d'ajouter i386 dans les architectures. mais pas de chance

70
yarlg

Après avoir lutté avec ce même problème et après avoir suivi toutes les réponses acceptées concernant la mise à jour des paramètres de construction, la suppression du chemin de recherche de l'éditeur de liens, etc., j'ai finalement découvert une réponse qui fonctionnait pour moi.

Avant de construire, assurez-vous de sélectionner le bon type (iPhone Simulator) au lieu de Périphérique iOS. Puis reconstruire. Sinon, vous essayez d'utiliser une bibliothèque conçue pour un périphérique iOS (processeur de bras) sur un simulateur sur votre mac (i386). Ça aurait dû être évident, mais ça ne l'était pas.

Avant:

iOS Device Settings

Après:

iPhone 5.1 Simulator Settings

Recherchez maintenant dans le groupe Produits du navigateur> cliquez avec le bouton droit de la souris sur votre bibliothèque statique (fichier .a)> Afficher dans le Finder, vous remarquerez qu'il se trouve dans un dossier Debug-iphonesimulator au lieu de Debug-iphoneos. À l'origine, je n'avais prêté aucune attention au nom du dossier, ou j'aurais peut-être pensé à cela plus tôt.

J'espère que cela t'aides.

71
Cody A. Ray

Parfois, ce genre d'erreurs vous irrite!

Supprimer les données dérivées fonctionne pour moi:

Étapes à suivre

1) Dans XCODE> Windows> Projet> Sélectionnez votre projet> Supprimer les données dérivées> Quittez XCODE et rouvrez-le> Si vous obtenez une erreur échouée avec MAC-O-Linker> Refere this link> Nettoyez et reconstruisez à nouveau.

41

Votre libnetUtils.a est en cours de construction pour une architecture différente de celle de votre cible.

Vérifiez les paramètres de construction de libnetUtils. Les architectures pour lesquelles il est construit et sa liste d'architectures prises en charge doivent être un sur-ensemble (faible) de l'architecture de votre cible. La complexité réside dans le fait que l'architecture résultante est répartie sur différents paramètres: "Architectures", "Construire une architecture active uniquement" et "Architectures valides". 

Les paramètres "Construire uniquement une architecture active" rendent cette opération particulièrement déroutante. Par exemple, supposons que vous construisiez pour le simulateur. Si le paramètre "Construire uniquement une architecture active" pour Debug est défini sur NO, toutes les architectures répertoriées dans "Architectures" et "Architectures valides" seront construites (probablement armv7, etc.). Mais si libnetUtils a ce paramètre défini sur Oui (Debug: Oui), il ne construit que pour i386. Ainsi, lorsque votre éditeur de liens tente de lier armv7 à i386, il échoue.

27
achow

Si j'obtiens l'avertissement de fichier ignoré - j'exécuterais lipo -info sur un fichier ignoré pour trouver son architecture comme ci-dessous

lipo -info libnetUtils.a

Cela imprimerait soit i386, armv6, armv7, armv7s, x86_64, etc. En général, cette architecture doit correspondre à votre plate-forme de construction cible. Par exemple.

  • i386 = simulateur ios ou version 32 bits sur mac os x
  • armv6 armv7 arm7s = périphérique ios
  • x86_64 = construction 64 bits sur mac os x

Selon la non-concordance, vous devez reconstruire votre bibliothèque pour votre plate-forme cible ou modifier votre plate-forme cible.

Remarque: Pour les binaires fat, lipo -info imprimera une combinaison des architectures ci-dessus.

22
Kiran

Je ne sais pas vraiment si mon conseil est correct, mais essayez de vérifier ceci:

  • Sélectionnez votre projet
  • Sélectionnez "Paramètres de construction"
  • Architectures de contrôle:
    • Les architectures valides doivent être "armv6 armv7"
    • Les plateformes supportées doivent être "iphonesimulator iphoneos" (peut-être un iPad, je ne sais pas)
    • Base SDK - votre SDK iOS (j'ai iOS 5.0).

Ne me jugez pas si je suis capitaine évident :)

9
Alexander Bekert

Cela signifie que la bibliothèque que vous essayez d'utiliser n'a pas été compilée universellement pour le simulateur iOS (les symboles i386 correspondent au Mac). L'exécuter sur un périphérique réel devrait cependant fonctionner correctement.

5
CodaFi

Avait le même problème, et essayé diverses solutions de la page en vain ..__ J'ai toujours eu un message me disant que ma bibliothèque n'était pas construite pour arm64.

Enfin comment j'ai résolu le problème:

  • ouvert le projet.pbxproj pour la bibliothèque dans un éditeur de texte
  • recherché VALID_ARCHS
  • il y a eu 4 occurrences dont 2 ne contenant pas arm64
  • J'ai ajouté manuellement arm64 dans la chaîne (VALID_ARCHS = "arm64 i386 armv7 armv7s")
  • reconstruire la lib et tout allait bien

Il semble parfois que les paramètres de construction affichés par XCode soient incomplets et ne correspondent pas précisément au fichier de projet.

3
Eino Gourdin

Ce problème ne se produira pas lorsque nous exécuterons l'application sur le périphérique. Vous pouvez le vérifier en exécutant le code sur un périphérique iOS.

0

Pour moi, il a été corrigé de régler Build Active Architecture Only sur Multiple values. Pour ce faire, vous devez le développer et définir Debug sur YES et Release sur No. Et maintenant, il compile sur mon appareil.

0
JESERRANO