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 directory
est relatif auDerivedData
répertoire, maisheaders 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?
la source
Réponses:
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
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.
la source
$(TARGET_BUILD_DIR)
. Même lors de l'archivage. ;)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
Paramètres de projet de bibliothèque statique
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.
Paramètres du projet utilisant la bibliothèque statique
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.
Commencez à utiliser la bibliothèque
Vous devriez maintenant pouvoir importer votre bibliothèque statique en utilisant
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:
É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.
la source
Le projet Xcode 4 ne parvient pas à compiler une bibliothèque statique
Les erreurs peuvent inclure; fichiers d'en-tête manquants, "problème lexical ou préprocesseur"
Solutions:
la source
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:
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.
la source
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.
la source
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/
la source
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.
la source
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
la source
Ajoutez le chemin suivant à vos chemins de recherche d'en-tête utilisateur :
Ceci est vérifié!
la source
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 ...
la source
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 :
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:
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.la source
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)
Modifiez la partie URL relative en
usr/local/include
fonction de ce qui se trouve dans le paramètre `` Chemin du dossier d'en-tête public '' de la bibliothèque statiquela source
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 desearch headers
j'ai même ajouté auframework headers
chemin de recherche,include
d la.h
directement et est allé à toutes sortes de grands efforts pour essayer de seDropboxSDK.h
trouver.Solution
EXPLICITÉ faites glisser le
DropboxSDK.framework
fichier dans XcodeProject Navigation
et assurez-vous qu'ilCopy Files if needed
est coché. Assurez-vous également que votre cible est vérifiée si nécessaire.avertissement
Définir l'emplacement explicite du framework dans
build phases
n'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
la source
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.
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!
la source
simply use frameworks - always -
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.
la source
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.la source
É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
la source