Xcode 4 ne peut pas localiser les fichiers d'en-tête publics à partir d'une dépendance de bibliothèque statique

91

Titres alternatifs pour faciliter la recherche

  • Xcode ne trouve pas l'en-tête
  • .H manquant dans Xcode
  • Fichier Xcode .h introuvable
  • Fichier de problème lexical ou de préprocesseur introuvable

Je travaille sur un projet d'application iOS qui vient de Xcode 3. Je suis maintenant passé à Xcode 4 mon projet construit un certain nombre de bibliothèques statiques.

Ces bibliothèques statiques déclarent également des en-têtes publics et ces en-têtes sont utilisés par le code de l'application. Dans Xcode 3.x, les en-têtes ont été copiés (en tant que phase de construction) dans le public headers directory, puis dans le projet d'application, le a public headers directoryété ajouté au headers search list.

Sous Xcode 4, le répertoire de construction est déplacé vers ~/Library/Developer/Xcode/DerivedData/my-project.

Le problème est de savoir comment référencer ce nouvel emplacement dans les paramètres de recherche des en-têtes? Il paraît que:

  • public headers directoryest relatif au DerivedDatarépertoire, mais
  • headers search le répertoire est relatif à quelque chose d'autre (peut-être l'emplacement du projet)

Comment dois-je configurer une cible de bibliothèque statique pour le développement iOS dans Xcode 4 qui garantira que les fichiers d'en-tête sont mis à la disposition des clients qui utilisent la bibliothèque statique lorsqu'ils tentent de compiler en tant que dépendance?

Richard Stelling
la source
Peut être lié aux noms de chemin. Veuillez vérifier ce post. [Bibliothèques statiques dans Xcode 4] [1] [1]: stackoverflow.com/questions/6074576/static-libraries-in-xcode-4/...
Diego Marafetti

Réponses:

124

Chacune des solutions que j'ai vues à ce problème a semblé soit inélégante (copier les en-têtes dans le projet de l'application) soit trop simplifiée au point qu'elles ne fonctionnent que dans des situations triviales.

La réponse courte

Ajoutez le chemin suivant à vos chemins de recherche d'en-tête utilisateur

"$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts"

Pourquoi ça marche?

Premièrement, nous devons comprendre le problème. Dans des circonstances normales, c'est-à-dire lorsque vous exécutez, testez, profilez ou analysez , Xcode construit votre projet et place la sortie dans le répertoire Build / Products / Configuration / Products, qui est disponible via la macro $ BUILT_PRODUCTS_DIR .

La plupart des guides concernant les bibliothèques statiques recommandent de définir le chemin du dossier des en-têtes publics sur $ TARGET_NAME , ce qui signifie que votre fichier lib devient $ BUILT_PRODUCTS_DIR /libTargetName.a et vos en-têtes sont placés dans $ BUILT_PRODUCTS_DIR / TargetName. Tant que votre application inclut $ BUILT_PRODUCTS_DIR dans ses chemins de recherche, les importations fonctionneront dans les 4 situations ci-dessus. Cependant, cela ne fonctionnera pas lorsque vous essayez d'archiver.

L'archivage fonctionne un peu différemment

Lorsque vous archivez un projet, Xcode utilise un dossier différent appelé ArchiveIntermediates. Dans ce dossier, vous trouverez / YourAppName / BuildProductsPath / Release-iphoneos /. C'est le dossier vers lequel pointe $ BUILT_PRODUCTS_DIR lorsque vous effectuez une archive. Si vous regardez là-dedans, vous verrez qu'il y a un lien symbolique vers votre fichier de bibliothèque statique construit mais le dossier avec les en-têtes est manquant.

Pour trouver les en-têtes (et le fichier lib), vous devez accéder à IntermediateBuildFilesPath / UninstalledProducts /. Rappelez-vous quand on vous a dit de définir Ignorer l'installation sur OUI pour les bibliothèques statiques? Eh bien, c'est l'effet de ce paramètre lorsque vous créez une archive.

Remarque: si vous ne le configurez pas pour ignorer l'installation, vos en-têtes seront placés dans un autre emplacement et le fichier lib sera copié dans votre archive, vous empêchant d'exporter un fichier .ipa que vous pouvez soumettre à l'App Store .

Après de nombreuses recherches, je n'ai trouvé aucune macro qui correspond exactement au dossier UninstalledProducts, d'où la nécessité de construire le chemin avec "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts"

Résumé

Pour votre bibliothèque statique, assurez-vous que vous ignorez l'installation et que vos en-têtes publics sont placés dans $ TARGET_NAME.

Pour votre application, définissez les chemins de recherche de vos en-têtes utilisateur sur "$ (BUILT_PRODUCTS_DIR)", ce qui fonctionne bien pour les builds standards, et "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts", qui fonctionne pour les builds d'archives.

Colin
la source
Quel est le lien avec le dossier DerivedData?
Richard Stelling
Les builds réguliers vont à: DerivedData / WorkspaceName-hash / Build / Products / Debug-iphoneos / TargetName.app --- Les builds d'archives vont à: DerivedData / WorkspaceName-hash / Build / Intermediates / ArchiveIntermediates / TargetName / BuildProductsPath / Release-iphoneos / TargetName.app
Colin
3
Pour moi, utiliser "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts" avec la case à cocher récursive ne fonctionnait pas. Dès que j'ai utilisé "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts / <nameOfStaticLibrary>" sans le drapeau récursif, cela a fonctionné pour moi.
TPoschel
7
Notez que votre $ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts est en fait $(TARGET_BUILD_DIR). Même lors de l'archivage. ;)
Pascal
1
Pour moi dans Xcode 5: $ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts / include / NOM DE LA BIBLIOTHÈQUE Je n'ai pas réglé sur OUI: recherchez toujours les chemins utilisateur.
xarly
84

J'ai rencontré ce même problème lors du développement de ma propre bibliothèque statique et bien que la réponse de Colin ait été très utile, j'ai dû la modifier un peu pour qu'elle fonctionne de manière cohérente et simple lors de l'exécution et de l'archivage de projets sous Xcode 4 à l'aide d'un espace de travail.

Ce qui est différent avec ma méthode, c'est que vous pouvez utiliser un seul chemin d'en-tête utilisateur pour toutes vos configurations de construction.

Ma méthode est la suivante:

Créer un espace de travail

  1. Sous Xcode 4, accédez à Fichier, Nouveau, Espace de travail.
  2. À partir du Finder, vous pouvez ensuite faire glisser les projets .xcodeproj pour la bibliothèque statique que vous souhaitez utiliser et la nouvelle application que vous créez et qui utilise la bibliothèque. Consultez la documentation Apple pour plus d'informations sur la configuration des espaces de travail: https://developer.apple.com/library/content/featuredarticles/XcodeConcepts/Concept-Workspace.html

Paramètres de projet de bibliothèque statique

  1. Assurez-vous que tous les en-têtes de la bibliothèque statique sont définis pour être copiés sur «Public». Cela se fait sous les paramètres de la cible de la bibliothèque statique> Phases de construction. Dans la phase "Copier les en-têtes", assurez-vous que tous vos en-têtes se trouvent dans la section "Public".
  2. Ensuite, allez dans Paramètres de construction, recherchez "Chemin du dossier des en-têtes publics" et saisissez un chemin pour votre bibliothèque. Je choisis d'utiliser ceci:

include / LibraryName

J'ai adopté cela de l'utilisation avec RestKit et j'ai trouvé que cela fonctionne mieux avec toutes mes bibliothèques statiques. Cela indique à Xcode de copier tous les en-têtes que nous avons déplacés dans la section des en-têtes «publics» à l'étape 1 dans le dossier que nous spécifions ici et qui réside dans le dossier Données dérivées lors de la construction. Comme avec RestKit, j'aime utiliser un seul dossier "include" pour contenir chaque bibliothèque statique que j'utilise dans un projet.

Je n'aime pas non plus utiliser des macros ici car cela nous permettra d'utiliser un seul chemin de recherche d'en-tête d'utilisateur plus tard lorsque nous configurerons le projet à l'aide de la bibliothèque statique.

  1. Recherchez «Ignorer l'installation» et assurez-vous que ce paramètre est défini sur OUI.

Paramètres du projet utilisant la bibliothèque statique

  1. Ajoutez la bibliothèque statique en tant que cadre sous Phases de construction> Lier le binaire avec les bibliothèques et ajoutez le fichier libLibraryName.a pour la bibliothèque statique que vous souhaitez utiliser.
  2. Ensuite, assurez-vous que le projet est configuré pour rechercher les chemins de recherche des utilisateurs. Cela se fait sous Paramètres de construction> Toujours rechercher les chemins utilisateur et assurez-vous qu'il est défini sur OUI.
  3. Dans la même zone, recherchez les chemins de recherche des en-têtes d'utilisateurs et ajoutez:

    "$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / include"

Cela indique à Xcode de rechercher les bibliothèques statiques dans le dossier de construction intermédiaire créé par Xcode pendant le processus de construction. Ici, nous avons le dossier «include» que nous utilisons pour nos emplacements de bibliothèque statique que nous avons configurés à l'étape 2 pour les paramètres du projet de bibliothèque statique. Il s'agit de l'étape la plus importante pour que Xcode trouve correctement vos bibliothèques statiques.

Configurer l'espace de travail

Ici, nous voulons configurer l'espace de travail afin qu'il construise la bibliothèque statique lorsque nous construisons notre application. Cela se fait en modifiant le schéma utilisé pour notre application.

  1. Assurez-vous d'avoir sélectionné le schéma qui créera votre application.
  2. Dans la liste déroulante du schéma, choisissez Modifier le schéma.
  3. Sélectionnez Construire en haut de la liste sur la gauche. Ajoutez une nouvelle cible en appuyant sur le + dans le volet central.
  4. Vous devriez voir la bibliothèque statique apparaître pour la bibliothèque que vous essayez de lier. Choisissez la bibliothèque statique iOS.
  5. Cliquez à la fois sur Exécuter et Archiver. Cela indique au schéma de compiler les bibliothèques pour la bibliothèque statique chaque fois que vous créez votre application.
  6. Faites glisser la bibliothèque statique au-dessus de la cible de votre application. Cela rend les bibliothèques statiques compilées avant la cible de votre application.

Commencez à utiliser la bibliothèque

Vous devriez maintenant pouvoir importer votre bibliothèque statique en utilisant

import <LibraryName/LibraryName.h>

Cette méthode évite les tracas d'avoir à avoir différents chemins d'en-tête utilisateur pour différentes configurations, vous ne devriez donc avoir aucun problème à compiler pour les archives.

Pourquoi ça marche?

Tout dépend de ce chemin:

"$(PROJECT_TEMP_DIR)/../UninstalledProducts/include"

Étant donné que nous configurons notre bibliothèque statique pour utiliser «Ignorer l'installation», les fichiers compilés sont déplacés vers le dossier «UninstalledProjects» dans le répertoire de construction temporaire. Notre chemin ici résout également le dossier "include" que nous avons configuré pour notre bibliothèque statique et que nous utilisons pour le chemin de recherche de notre en-tête utilisateur. Les deux fonctionnant ensemble permettent à Xcode de savoir où trouver notre bibliothèque pendant le processus de compilation. Étant donné que ce répertoire de construction temporaire existe pour les configurations de débogage et de version, vous n'avez besoin que d'un seul chemin pour Xcode pour rechercher des bibliothèques statiques.

gdavis
la source
3
Vous êtes génial, mec! Ceci est vraiment utile et fonctionne comme vous l'avez décrit.
neevek
1
impressionnant. Où dois-je envoyer des fleurs :)
Ramesh
1
Après avoir configuré cela, certains d'entre vous pourraient rencontrer " ...] un sélecteur non reconnu envoyé à la classe 0x ... ". Dans le cas où vous le faites, essayez d'ajouter cela dans les cibles de votre projet-> Projet-> Paramètres de construction-> Liaison-> Autres indicateurs de liaison
MkVal
Assurez-vous que les chemins de recherche des en-têtes utilisateur sont entre guillemets s'ils contiennent des espaces.
respectTheCode
Xcode 4.6.2 n'écrit rien dans "$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / include" pour moi. Une idée de ce qui me manque? Ou le comportement de Xcode a-t-il encore changé?
c roald
16

Le projet Xcode 4 ne parvient pas à compiler une bibliothèque statique

Question associée: "Fichier de problème lexical ou de préprocesseur introuvable" dans Xcode 4

Les erreurs peuvent inclure; fichiers d'en-tête manquants, "problème lexical ou préprocesseur"

Solutions:

  1. Vérifiez que les "chemins d’en-tête utilisateur" sont corrects
  2. Définissez "Toujours rechercher les chemins utilisateur" sur OUI
  3. Créez un appel de groupe "En-têtes d'indexation" dans votre projet et faites glisser les en-têtes vers ce groupe, NE PAS ajouter à des cibles lorsque vous y êtes invité.
Richard Stelling
la source
11
Une autre étape facilement négligée mais extrêmement importante: assurez-vous que vos chemins de recherche sont entourés de guillemets doubles pour éviter les espaces. J'oublie toujours de faire ça.
Brad
Merci @Brad, c'est en effet une remarque très importante et utile.
Julian D.
15

C'était un fil très utile. En recherchant ma propre situation, j'ai découvert qu'Apple avait un document de 12 pages daté de septembre 2012 intitulé «Utilisation des bibliothèques statiques sous iOS». Voici le lien pdf: http://developer.apple.com/library/ios/technotes/iOSStaticLibraries/iOSStaticLibraries.pdf

C'est beaucoup plus simple que la plupart des discussions sur Internet, et avec quelques petits mods pour rendre compte de la configuration des bibliothèques externes que j'utilise, cela fonctionne bien pour moi. La partie la plus importante est probablement:

Si votre bibliothèque cible a une phase de construction «Copier les en-têtes», vous devez la supprimer; Les phases de construction des en-têtes de copie ne fonctionnent pas correctement avec les cibles de bibliothèque statiques lors de l'exécution de l'action «Archiver» dans Xcode.

Les nouvelles cibles de bibliothèque statiques créées avec Xcode 4.4 ou version ultérieure seront accompagnées d'une phase de copie de fichiers correctement configurée pour les en-têtes, vous devriez donc vérifier si vous en avez déjà une avant d'en créer une. Si vous ne le faites pas, appuyez sur "Ajouter une phase de construction" en bas de l'éditeur cible et choisissez "Ajouter des fichiers de copie". Divulguez la nouvelle phase de création de copie de fichiers et définissez la destination sur «Répertoire des produits». Définissez le sous-chemin pour inclure / $ {PRODUCT_NAME}. Cela copiera les fichiers dans un dossier nommé d'après votre bibliothèque (extrait du paramètre de construction PRODUCT_NAME), dans un dossier nommé include, dans votre répertoire de produits construits. Le dossier d'inclusion à l'intérieur d'un répertoire de produits de construction se trouve dans le chemin de recherche d'en-tête par défaut des applications, c'est donc un endroit approprié pour placer les fichiers d'en-tête.

Je suis sûr que dans de nombreuses situations existantes, l'approche d'Apple peut ne pas être suffisante. Je poste ceci ici pour tous ceux qui ne font que commencer leur voyage sur le chemin du jardin statique de la bibliothèque - cela peut être le meilleur point de départ pour des cas simples.

Michael J.
la source
pour ceux qui suivent le lien ci-dessus .. attention: l'étape qui vous demande de supprimer les fichiers modèles factices lors de la création du projet de bibliothèque .. NE SUPPRIMEZ PAS LE fichier * .pch .. il finira par vous hanter + ce qui précède le conseil ne fonctionne pas avec les catégories ... il existe une solution pour cela (vu quelque part)
abbood
Merci de fournir un lien vers une approche officielle d'Apple pour la création de bibliothèques statiques. J'ai commencé par construire ma bibliothèque statique en utilisant cette approche , mais je n'ai pas pu archiver. @abbood - Quel est le problème de la suppression du fichier pch généré?
augusto callejas
si vous supprimez le fichier .pch .. le projet ne se compilera tout simplement pas .. (à des fins d'archivage ou autre) ..
abbood
Cela ne fonctionne pas pour moi. Lorsque j'essaye une instruction d'importation avec "" cela ne fonctionne pas, j'ai besoin de <>. De plus, lors de l'archivage, il n'est pas possible de trouver des en-têtes. Des idées?
user1010819
4

http://developer.apple.com/library/ios/#technotes/iOSStaticLibraries/Articles/creating.html

Par documentation Apple:

Votre bibliothèque aura un ou plusieurs fichiers d'en-tête que les clients de cette bibliothèque doivent importer. Pour configurer les en-têtes exportés vers les clients, sélectionnez votre projet de bibliothèque pour ouvrir l'éditeur de projet, sélectionnez la bibliothèque cible pour ouvrir l'éditeur cible et sélectionnez l'onglet des phases de construction. Si votre bibliothèque cible a une phase de construction «Copier les en-têtes», vous devez la supprimer; Les phases de construction des en-têtes de copie ne fonctionnent pas correctement avec les cibles de bibliothèque statiques lors de l'exécution de l'action «Archiver» dans Xcode.

dmarnel
la source
3

Jetez un œil à la solution de Jonah Wlliam (à mi-chemin) et au modèle GitHub (dans les commentaires) pour un aperçu. http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/

d1bru
la source
4
Bien que cela puisse techniquement répondre à la question, il serait préférable pour vous d'inclure les parties essentielles de l'article lié dans votre réponse et de fournir le lien pour référence. Si vous ne le faites pas, la réponse est menacée par la pourriture des liens.
jscs
2

Ajoutez $ (OBJROOT) / UninstalledProducts / exactPathToHeaders aux chemins de recherche d'en-tête.

Pour une raison quelconque, la case à cocher récursive ne fonctionnait pas pour moi et j'ai dû ajouter le reste du chemin à l'emplacement des en-têtes.

Sous le navigateur de journal dans Xcode (l'onglet à droite du navigateur de points d'arrêt), vous pouvez voir l'historique de construction. Si vous sélectionnez l'échec de construction réel, vous pouvez développer ses détails pour voir le PATH setenv et vérifier que le chemin d'accès à vos fichiers d'en-tête est présent.

Collin
la source
Bonne note sur la case à cocher récursive, même problème ici.
Codezy
Oui, je devais également spécifier un sous-dossier particulier, la vérification récursive ne fonctionnait pas.
Oliver Pearmain
J'ai fini par utiliser ce chemin cependant (simplement parce que c'est plus court) "$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / SubProjectHeaders"
Oliver Pearmain
2

Dans mon cas, mon espace de travail avait quelques projets de bibliothèques statiques et l'un d'eux a une dépendance comprenant des fichiers d'en-tête avec l'autre. Le problème concernait l'ordre de construction. Dans la page Modifier le schéma sous la section Construire, j'ai désélectionné l'option de parallélisation et organisé l'ordre des cibles selon les dépendances et cela a été résolu par problème

Vamshi
la source
1

Ajoutez le chemin suivant à vos chemins de recherche d'en-tête utilisateur :

$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts

Ceci est vérifié!

yirenjun
la source
1

Au risque de montrer à quel point je suis idiot ... j'ai souffert de XCode refusant de retrouver mes fichiers .h tout l'après-midi.

Puis j'ai réalisé.

Parce que j'utilisais "XCode 4", j'avais "intelligemment" décidé de mettre tous mes projets dans un sous-dossier d'un dossier appelé " XCode 4 projects ".

Ces espaces dans le nom du dossier ont foiré XCode en grand!

Renommer ce dossier en " XCode_4_Projects " a ramené la joie (et moins les jurons) dans ma vie.

Rappelez-moi encore, quelle année est-ce?

Peut-être que quelqu'un pourrait dire aux développeurs Apple ...

Mike Gledhill
la source
1

Aucune de ces réponses n'a fonctionné pour moi. Voici ce qui a fait. Ajoutez exactement ce qui suit (copiez et collez y compris les guillemets doubles) à votre paramètre de génération Chemins de recherche d'en-tête utilisateur :

"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include/"

Notez l'ajout du sous-répertoire "/ include /" par rapport aux autres réponses. Comme d'autres utilisateurs l'ont souligné, l'option "récursive" ne semble rien faire, vous pouvez donc l'ignorer.

Mon projet a maintenant pu être archivé avec succès lors de l'importation de fichiers d'en-tête de bibliothèque statiques sous la forme suivante:

#import "LibraryName/HeaderFile.h"

Vous n'avez pas besoin d'activer le paramètre Toujours rechercher les chemins utilisateur sauf si vous incluez les en-têtes de votre bibliothèque statique avec des crochets angulaires ( #import <LibraryName/HeaderFile.h>), mais vous ne devriez vraiment pas le faire de toute façon si ce n'est pas un en-tête système / cadre.

devios1
la source
1

Aucune des réponses ci-dessus n'a fonctionné pour moi sur Xcode 7 mais elles m'ont cependant donné une bonne idée. Pour les gars qui ont des difficultés sur Xcode 7, j'ai résolu ce problème en ajoutant ce qui suit aux chemins de recherche des en-têtes d'utilisateurs (y compris les guillemets)

"$(BUILT_PRODUCTS_DIR)/usr/local/include"

Modifiez la partie URL relative en usr/local/includefonction de ce qui se trouve dans le paramètre `` Chemin du dossier d'en-tête public '' de la bibliothèque statique

Porte Evol
la source
0

C'est un problème connexe qui m'a conduit à cette question donc j'ajoute ma solution strictement pour la documentation / cela pourrait sauver une autre âme des heures de transpiration

Fichier DropboxSDK.h introuvable

Après des jours à essayer de faire compiler VES pour iOS, j'ai finalement rencontré ce problème. l' DropboxSDK.hétait sans aucun doute à la portée de search headersj'ai même ajouté au framework headerschemin de recherche, included la .hdirectement et est allé à toutes sortes de grands efforts pour essayer de se DropboxSDK.htrouver.

Solution

EXPLICITÉ faites glisser le DropboxSDK.frameworkfichier dans Xcode Project Navigationet assurez-vous qu'il Copy Files if neededest coché. Assurez-vous également que votre cible est vérifiée si nécessaire.

avertissement

Définir l'emplacement explicite du framework dans build phasesn'a pas fonctionné pour moi. J'ai dû faire glisser le .framework dans Xcode et m'assurer que les fichiers étaient copiés dans mon projet.

# mbp2015 # xcode7 # ios9

Jacksonkr
la source
0

Il existe différentes façons complexes de le faire, et des solutions très intelligentes sont proposées dans ce fil.

Le principal problème de toutes ces solutions est qu'elles réduisent considérablement la portabilité de votre bibliothèque.

  • Chaque fois que vous avez besoin de démarrer un nouveau projet en utilisant votre bibliothèque et de l'archiver pour iTunes, c'est un enfer de configuration.
  • A chaque fois que vous avez besoin de partager votre projet avec votre équipe ou vos clients, il peut casser pour n'importe quelle raison (contexte, version Xcode, peu importe, ..)

Mon choix a finalement été d'utiliser simplement des frameworks - toujours - comme recommandé par Apple (Vidéos WWDC).

C'est tellement plus facile et fait le même travail à la fin!

Une autre solution assez élégante qui semble fonctionner est d'utiliser des Cocoapods privés. Cocoapods fait tout le travail de configuration, copie d'en-tête, etc.

Les cadres sont rock!

élan
la source
1
Où placez-vous cela? simply use frameworks - always -
Neil Faulkner
Il ne se situe nulle part. C'est simplement un choix architectural. Les cadres sont des «bibliothèques modernes» qui sont beaucoup plus faciles à lier et à gérer. Au moment de ce message, swift ne permet toujours pas de construire des bibliothèques binaires.
Moose
0

Voici ce qui a résolu le même problème pour moi.

J'ai une cible d'application et une cible d'extension iMessage. Ensuite, j'avais 2 SDK (le mien), auxquels la cible d'application est liée.

Le problème était: ma cible iMessage utilisait également mes 2 SDK (projets séparés), mais elle ne les liait pas dans Build Phases -> Link Binary With Libraries. J'ai dû y ajouter mes 2 SDK à la cible iMessage, pour correspondre à ma cible d'application, et maintenant elle archive.

Donc, la morale de l'histoire est la suivante: si vous avez plusieurs cibles, telles que des extensions, assurez-vous que toutes vos cibles sont liées aux bibliothèques dont elles ont besoin. Il a pu construire et déployer sur le simulateur et l'appareil, mais pas sur l'archivage.

FranticRock
la source
0

Mise à jour: Xcode 9

Les réponses ci-dessus n'ont pas fonctionné pour moi en utilisant Xcode 9, mais cette réponse a parfaitement fonctionné pour moi. J'ai ajouté $(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/includeà mes «chemins de recherche d'en-tête» et Xcode a lié l'en-tête de ma bibliothèque statique sans problème.

Mohammed Abdullatif
la source
-18

Épargnez-vous le problème et faites ceci = créez un nouveau compte utilisateur sur votre Mac - ouvrez le projet sous le nouveau compte utilisateur - tous les problèmes disparaissent. Économisez votre temps et gardez votre santé mentale. toutes ces réponses ringard n'aident pas !!

Bonne chance

Max
la source