Suppléants titres à l'aide de la recherche
- Xcode ne trouvez pas d'en-tête
- Manquant .h dans Xcode
- Xcode .h fichier non trouvé
- lexicale ou de préprocesseur problème de fichier non trouvé
Je suis en train de travailler sur une application iOS, projet qui est venu à partir de Xcode 3. J'ai maintenant déménagé à Xcode 4 mon projet s'appuie un certain nombre de bibliothèques statiques.
Ces bibliothèques statiques également déclarer public les en-têtes 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 (phase de construction) à l'
public headers directory
, puis dans le projet d'application de l'public headers directory
a été ajouté à l'headers search list
.Sous Xcode 4 le répertoire de construction est déplacé
~/Library/Developer/Xcode/DerivedData/my-project
.Le problème est de savoir comment dois-je faire référence à ce nouvel emplacement dans les en-têtes paramètres de recherche? Il semble que:
public headers directory
est relatif à l'DerivedData
répertoire, maisheaders search
répertoire est par rapport à quelque chose d'autre (peut-être le lieu du projet)Comment dois-je définir une bibliothèque statique cible pour le développement d'iOS dans Xcode 4 qui va assurer les fichiers d'en-tête sont disponibles pour les clients qui utilisent la bibliothèque statique lorsque vous essayez de compiler une dépendance?
Réponses
Trop de publicités?Chacune des solutions que j'ai vu à ce problème, soit ont semblé peu élégante (copie des en-têtes dans le projet de l'application) ou trop simplifiée, au point qu'ils ne fonctionnent que dans des situations triviales.
La réponse courte
Ajoutez le chemin d'accès suivant pour votre en-Tête Utilisateur Chemins de Recherche
"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts"
Pourquoi ce travail?
Tout d'abord, nous avons besoin de comprendre le problème. Dans des circonstances normales, c'est à dire lorsque vous Exécutez, de Test, de Profil ou de les Analyser, Xcode, construit votre projet et met le résultat dans la Construction/Produits/Configuration/répertoire de Produits, qui est disponible via le $BUILT_PRODUCTS_DIR macro.
La plupart des guides concernant les bibliothèques statiques vous recommandons de définir les en-Têtes Publics Chemin d'accès au Dossier à $TARGET_NAME, ce qui signifie que votre fichier lib devient $BUILT_PRODUCTS_DIR/libTargetName.un et votre les en-têtes sont mises en $BUILT_PRODUCTS_DIR/TargetName. Tant que votre application inclut $BUILT_PRODUCTS_DIR dans ses chemins de recherche, puis des importations de travail dans les 4 situations donné ci-dessus. Toutefois, cela ne fonctionnera pas lorsque vous essayez d'archiver.
L'archivage fonctionne un peu différemment
Lorsque vous archivez un projet Xcode utilise un autre dossier appelé ArchiveIntermediates. Dans ce dossier vous trouverez /YourAppName/BuildProductsPath/Release-iphoneos/. C'est le dossier que $BUILT_PRODUCTS_DIR points lorsque vous faites une archive. Si vous regardez, vous verrez qu'il y est un lien symbolique vers votre bâti bibliothèque statique fichier mais un dossier avec les en-têtes est manquant.
Pour trouver les en-têtes (et le fichier lib), vous devez aller à IntermediateBuildFilesPath/UninstalledProducts/. Rappelez-vous quand il vous a été dit pour définir Sauter Installer OUI pour les bibliothèques statiques? Et bien c'est l'effet de ce paramètre est lorsque vous faites une archive.
Remarque: Si vous ne définissez pas d'ignorer les installer, vos en-têtes seront mis en encore une autre de l'emplacement et de la lib fichier sera copié dans votre archive, vous empêchant d'exporter un .fichier ipa que vous pouvez soumettre à l'App Store.
Après beaucoup de recherche, je ne pouvais pas trouver une macro qui correspond à la UninstalledProducts dossier exactement, 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 passez installer et que vos en-têtes sont placées dans $TARGET_NAME.
Pour votre application, définissez votre en-tête utilisateur chemins de la recherche pour "$(BUILT_PRODUCTS_DIR)", qui fonctionne très bien pour les réguliers construit, et "$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts", qui fonctionne pour les archives des builds.
Je suis tombé sur cette même question lors de l'élaboration de ma propre bibliothèque statique et, bien que sa réponse a été très utile, j'ai dû modifier un peu pour travailler de manière cohérente et simplement lorsque les deux en cours d'exécution et des projets d'archivage sous Xcode 4 à l'aide d'un espace de travail.
Ce qui est différent au sujet de ma méthode est que vous pouvez utiliser un seul utilisateur en-tête de chemin d'accès pour l'ensemble de vos configurations de build.
Ma méthode est comme suit:
Créer un espace de travail
- Sous Xcode 4, allez dans Fichier, Nouveau, de l'espace de travail.
- Depuis le Finder, vous pouvez ensuite faire glisser dans la .xcodeproj projets pour la bibliothèque statique que vous souhaitez utiliser, et la nouvelle application, vous êtes de construction qui utilise la bibliothèque. Voir Apple Docs pour plus d'informations sur la configuration des espaces de travail: http://developer.apple.com/library/ios/#featuredarticles/XcodeConcepts/Concept-Workspace.html
Projet De Bibliothèque Statique Paramètres
- Assurez-vous que tout le statique de la bibliothèque les en-têtes sont mis à copier "Public". Cela se fait dans les paramètres de la bibliothèque statique cible > Phases de construction. Dans la "Copie des en-Têtes de" phase", assurez-vous que tous les en-têtes sont dans le "Public".
- Ensuite, allez à Paramètres de construction, de trouver des "en-Têtes Publics Chemin d'accès au Dossier" et tapez un chemin d'accès de votre bibliothèque. Je choisis d'utiliser ceci:
inclure/LibraryName
J'ai adopté le présent de l'utilisation avec RestKit et l'a trouvé qui fonctionne le mieux avec tous mes bibliothèques statiques. Cela dit Xcode pour copier tous les en-têtes, nous avons rejoint le "Public" en-têtes de section à l'étape 1 dans le dossier que nous préciser ici ce qui se trouve dans les Données Dérivées du dossier lors de la construction. Comme avec RestKit, j'aime utiliser un seul dossier inclure "pour contenir chaque statique de la bibliothèque que j'utilise dans un projet.
Je n'aime pas utiliser des macros ici, car il nous permettra d'utiliser un seul utilisateur en-tête de chemin de recherche plus tard, quand nous allons configurer le projet à l'aide de la bibliothèque statique.
- Trouver Ignorer "Installer" et assurez-vous que cette option est définie sur OUI.
Paramètres pour le Projet à l'Aide de la Bibliothèque Statique
- Ajouter la bibliothèque statique comme un cadre de Phases de construction > Lien Binaire Avec les Bibliothèques et les ajouter à la libLibraryName.un fichier pour une bibliothèque statique que vous souhaitez utiliser.
- Assurez-vous ensuite de projet est mis à la recherche pour l'Utilisateur Chemins de la Recherche. Ceci est fait en vertu de Construire Paramètres > Toujours à la Recherche de Chemins de l'Utilisateur et assurez-vous que défini à OUI.
-
Dans la même zone rechercher Utilisateur en-Tête de Chemins de Recherche et d'ajouter:
"$(PROJECT_TEMP_DIR)/../UninstalledProducts/include"
Cela dit Xcode à regarder pour les bibliothèques statiques à l'intérieur de l'intermédiaire construire dossier que Xcode crée durant le processus de construction. Ici, nous avons le "comprennent" le dossier que nous utilisons pour notre bibliothèque statique endroits que nous avons de configuration à l'étape 2 pour le projet de bibliothèque statique paramètres. C'est l'étape la plus importante dans l'obtention de Xcode correctement trouvez votre statiques des bibliothèques.
Configurer l'espace de travail
Ici, nous voulons configurer l'espace de travail de sorte qu'il permettra de construire la bibliothèque statique, lorsque nous construisons notre application. Cela se fait en modifiant le schéma utilisé pour notre application.
- Assurez-vous d'avoir le schéma sélectionné qui permettra de créer votre application.
- Dans le schéma déroulante, choisissez Modifier le Régime.
- Sélectionnez en haut de la liste sur la gauche. Ajouter une nouvelle cible en appuyant sur le + sur le volet du milieu.
- Vous devriez voir la bibliothèque statique de montrer pour la bibliothèque que vous êtes tenté de faire le lien. Choisissez l'iOS bibliothèque statique.
- Cliquez sur Exécuter et Archive. Ceci indique que le régime de compiler les bibliothèques à la bibliothèque statique à chaque fois que vous construisez votre application.
- Faites glisser la bibliothèque statique au-dessus de votre application cible. Cela rend les bibliothèques statiques avant de compiler votre application cible.
Commencer à Utiliser la Bibliothèque
Maintenant, vous devriez être en mesure d'importer votre bibliothèque statique à l'aide de
import <LibraryName/LibraryName.h>
Cette méthode permet de contourner les tracas d'avoir des différents utilisateurs de l'en-tête de chemins d'accès pour les différentes configurations, de sorte que vous ne devriez avoir aucun problème de compilation pour les archives.
Pourquoi ce travail?
Tout dépend de ce chemin:
"$(PROJECT_TEMP_DIR)/../UninstalledProducts/include"
Parce que nous allons configurer notre bibliothèque statique à utiliser Ignorer "Installer", les fichiers compilés sont déplacés vers le "UninstalledProjects" dossier sein de l'entreprise de répertoire de construction. Notre chemin, ici, correspond à la "inclure" dossier nous installons pour notre bibliothèque statique et les utiliser pour notre en-tête utilisateur chemin de recherche. Les deux travaillent ensemble Xcode permet de savoir où trouver notre bibliothèque durant le processus de compilation. Depuis cet accroissement temporaire répertoire existe pour le Debug et Release configurations, vous avez seulement besoin d'un seul chemin pour Xcode à la recherche pour les bibliothèques statiques.
Espérons que cela aide, amusez-vous!
Xcode 4 Projet ne parvient pas à compiler une bibliothèque statique
Liés à la question: "lexical ou préprocesseur problème de fichier non trouvé" dans Xcode 4
Des erreurs peuvent inclure; manquant fichiers d'en-tête, "lexicale ou de préprocesseur problème"
Solutions:
- Cochez la case "l'utilisateur en-tête chemins" sont corrects
- Set "Toujours à la recherche de chemins de l'utilisateur" sur "OUI"
- Créer un groupe d'appel de l'Indexation "en-têtes" dans votre projet et faites glisser les en-têtes de ce groupe, NE PAS ajouter à toutes les cibles lorsque vous y êtes invité.
Cela a été très utile thread. Dans la recherche de ma propre situation, je trouve qu'Apple a un document de 12 pages, daté de septembre 2012 intitulée "Utilisation des Bibliothèques Statiques dans iOS." Voici le lien pdf: http://developer.apple.com/library/ios/technotes/iOSStaticLibraries/iOSStaticLibraries.pdf
C'est beaucoup plus simple que la plupart de la discussion sur l'Internet, et avec quelques petits mods pour rendre compte de la façon dont les bibliothèques externes que j'utilise sont configurés, il fonctionne bien pour moi. La partie la plus importante est probablement:
Si votre bibliothèque cible a une "Copie des en-Têtes" phase de construction, vous devez supprimer; copie des en-têtes de phases de construction ne fonctionnent pas correctement avec statique bibliothèque des cibles lors de l'exécution de la "Archive" dans Xcode.
Nouvelle bibliothèque statique cibles créés avec Xcode 4.4 ou tard avec un correctement configuré Copier des Fichiers de phase pour les en-têtes, de sorte que vous devriez vérifier pour voir si vous avez déjà un avant d'en créer un. Si vous n'avez pas, appuyez sur "Ajouter une Phase de construction" en bas de l'éditeur cible et choisissez l'option "Ajouter la Copie de Fichiers". Divulguer la nouvelle Copie des Fichiers de construire de phase et de définir la Destination de "Répertoire de Produits." Définir la Subpath pour inclure/${NOM_PRODUIT}. Cela va copier les fichiers dans un dossier nommé après votre bibliothèque (prises à partir de la PRODUIT_NOM paramètre de construction), à l'intérieur un dossier nommé inclure, à l'intérieur de votre bâti répertoire de produits. L' inclure le dossier à l'intérieur de l'accumulation des produits de répertoire par défaut l'en-tête chemin de recherche pour les applications, c'est donc un endroit approprié pour mettre les fichiers d'en-tête.
Je suis sûr que dans de nombreuses situations, Apple pourrait ne pas être suffisant. Je poste ici pour quelqu'un qui vient de commencer leur voyage sur la bibliothèque statique chemin de jardin - c'est peut-être le meilleur point de départ pour les cas simples.
Jetez un oeil à la solution de Jonah kibou (milieu en bas) & modèle de GitHub (en commentaires) pour un aperçu. http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-Xcode-4/