32 votes

Comment obtenir des dépendances implicites pour travailler avec des espaces de travail dans Xcode 4 ?

Je veux gérer des projets dans des espaces de travail à l'aide de Xcode 4 avec Cocoa Touch Bibliothèque Statique des projets qui contiennent le code partagé que je pouvais référence à d'autres projets. Selon la WWDC 2010 vidéos et Xcode 4 documentation il y a une fonctionnalité pour les "dépendances implicites" pour les espaces de travail dans Xcode 4. J'ai essayé de le faire fonctionner et je ne suis pas beaucoup de succès.

L'Échantillon De L'Espace De Travail: DependenciesInXcode4.zip

Vous pouvez voir l'exemple très simple du projet a 2 bibliothèque statique projets que j'ai nommé Library1 et Library2. J'ai ensuite une classe unique à chaque projet qui, je l'référence à partir de l'iPhone projet appelé PrimaryApp. Je reçois le soutien de Sens du Code lors de l'ajout de l'instruction d'importation, mais l'échec de la construction.

Build Failed

Vous pouvez voir comment la génération échoue parce qu'il ne peut pas trouver les dépendances.

Build Errors

Pour résoudre ces problèmes, j'ai ajouté manuellement liés à la Library1 et Library2 projets.

Manual Linking

J'ai également eu à ajouter le chemin d'accès à ces projets comme en-Tête de Chemins de Recherche.

Manually Reference Headers

Maintenant, quand je construire à la fois de la dépendance des bibliothèques et puis exécutez PrimaryApp dans le Simulateur d'iPhone, il est construit avec succès et s'exécute. J'ai trouvé qu'il n'a pas toujours assurer que la dépendance projets sont construits en cas de besoin et c'est clairement un processus manuel. Ce n'est pas ce que je considère "dépendances implicites" comme Xcode vidéos et de la documentation n'implique pas qu'il doit travailler. J'ai été à la recherche pour plus d'exemples concrets, mais pour l'instant j'ai pas eu de chance. Même ici, sur Stackoverflow, je ne vois pas de réponse encore.

Il semble que les développeurs sont de revenir à d'anciennes techniques et pas vraiment à l'aide de la nouvelle "dépendances implicites" caractéristiques.

J'apprécierais un peu d'aide dans la compréhension de la façon d'obtenir des "dépendances implicites" de travailler avec des espaces de travail dans Xcode 4.

Voici mes questions:

  • Comment sont "dépendances implicites" censé travailler, dans Xcode 4 avec des espaces de travail?
  • Pourquoi ne peut pas le code dans Libary1 et Library2 être trouvés automatiquement dans PrimaryApp?
  • Certaines des modifications nécessaires pour rendre les dépendances de travail dans un espace de travail?

12voto

Rick Points 1603

Je viens de passer la meilleure partie de deux jours à la construction et à la reconstruction de notre projet, aux prises avec juste cette question. Alors que j'ai maintenant un projet qui se construit et correctement les liens ET le fait de travailler codesense je ne suis pas 100% satisfait de l'une des mesures qu'il semble être un peu un hack et certainement ne correspondent pas à mon concept de "implicite Automatique des dépendances".

FWIW voici les étapes que j'ai pris:

  1. Créer un nouvel espace de travail dans Xcode.
  2. Ajouter un nouveau projet à l'espace de travail pour votre bibliothèque statique. Vous pouvez également ajouter un projet existant, j'ai trouvé que c'était trop.
  3. Test de la bibliothèque construit comme prévu.
  4. Ajouter un nouveau projet à l'espace de travail pour votre projet principal. De nouveau, j'ai réussi à ajouter un existant, mais surtout, il n'a pas toutes les paramètres de construction déjà que liée à la bibliothèque. Si vous ajoutez un nouveau projet, son assez facile de simplement ajouter des fichiers source pour elle. Ma situation est compliquée par un très grand pré-existant dépôt SVN que je n'ai pas envie de restructurer.
  5. À ce stade, je vais supposer que votre code source contient déjà des importations des en-têtes de la bibliothèque statique.
  6. Dans les phases de construction pour le projet principal, développez le "lien binaire avec les bibliothèques" et cliquez sur le symbole+. Sélectionnez la cible de votre projet de bibliothèque statique.
  7. Si vous voulez, à ce stade, vous pouvez construire le projet principal pour confirmer qu'il ne parvient pas, comme indiqué dans l'OP captures d'écran avec "No such file..." erreurs pour l'en-tête des importations.
  8. Maintenant, c'est le peu que je n'aime pas vraiment. Dans votre projet principal de créer un nouveau groupe et de l'appeler Dépendante des en-Têtes ou quoi que ce soit. Maintenant dans le navigateur de projets de glisser tout utilisé les en-têtes de votre projet statique de ce nouveau groupe. Dans les options de la pop, j'ai juste laissé les réglages par défaut.
  9. Vous pouvez également le lien de votre projet principal avec tout dépendant des bibliothèques utilisées par votre bibliothèque statique. Par exemple, pour ma bibliothèque statique rend l'utilisation de libxml2 et CFNetwork et même si mon projet principal de ne pas les utiliser directement, j'ai eu des erreurs de compilation si je n'ai pas ajouter à la "lien binaire avec les bibliothèques" phase de construction.
  10. Votre principal projet doit maintenant (je l'espère) construire.

Je n'aime vraiment pas les étapes 8 et 9. Cela se sent vraiment comme XCode ne fait pas ce qu'il est annoncé à faire. Toutefois, si et quand elle se fixe au moins ces étapes sont assez facile de revenir en arrière pour qu'il fonctionne correctement.

Je pense que les "dépendances implicites" devrait fonctionner sans avoir besoin d'aller au-delà de l'étape 6, peut-être même l'étape 5, mais que peut-être un peu trop automagical pour beaucoup de gens de goût.

3voto

David Avendasora Points 2111

Cela ne semble vraiment être un bug dans Xcode traitement des dépendances implicites au cours du processus de construction.

Dans un espace de travail avec deux projets, j'ai été en mesure d'avoir Un Projet, voir les classes dans un Projet B et de développer correctement, copiez-la .h fichiers d'en-tête pour le Projet B de classes dans Un Projet de répertoire. NOTE: je n'ai pas les ajouter à Un Projet dans Xcode je viens de les mettre dans Un Projet de répertoire dans le Finder.

C'est une bien meilleure solution que j'en ai vu décrites ailleurs, comme il ne nécessite aucune modification de l'espace de travail les régimes ou les paramètres de construction de chaque projet. Avec la .h les fichiers dans Un Projet de répertoire, Xcode a pu automatiquement trouver et résoudre tous Un Projet de dépendances implicites sur le Projet B.

Malheureusement, vous ne pouvez pas mettre la .h les fichiers dans leur propre sous-répertoire appelé "XcodeBugWorkaroundHeaderFiles". Ils doivent être dans un répertoire que le projet est déjà la lecture .h les fichiers de. Aussi, les Alias ne fonctionne pas, mais les Liens Symboliques, alors en utilisant des liens symboliques vous n'avez pas à vous soucier de out-of-date, les copies.

Avec tout cela dit, je ne suis pas sûr que d'avoir des "stealth" .h les fichiers qui le bâtir échouera sans est une bonne idée, cependant. Jusqu'à ce que le bug est corrigé dans Xcode, il est probablement préférable de les ajouter au projet, de sorte que vous pouvez les voir dans Xcode.

1voto

Duane Fields Points 856

Une autre option est de simplement inclure la racine de chaque "sous-projet" comme un appel récursif à en-tête de chemin. Par exemple, si vous avez AcmeLib, vous pouvez aller pour le projet principal de créer des options et ajouter le chemin d'accès à AcmeLib à l'Utilisateur d'en-Tête de la Recherche de Chemin, avec le récursive option est activée. Ensuite, votre AcmeLib fichiers d'en-tête sera automatiquement recherché.

Pour maintenir le chemin de l'indépendance entre les développeurs, vous pouvez faire le chemin par rapport à un répertoire source variable, disons $ACME_LIB, qui chaque développeur peut périphérique dans XCode préférences "Sources" volet.

Donc pour utiliser AcmeLib dans un nouveau projet, il suffit de glisser dans le projet, ajoutez $ACME_LIB à l'en-tête de la recherche de chemin, et vous êtes bon pour aller. XCode de liaison implicite devrait accrocher les dépendances.

1voto

blackliteon Points 1221

Voici toutes les instructions dans un document Google Docs.

1voto

Anthony McCormick Points 645

J'ai obtenu cela pour travailler en faisant ce qui suit. 1. Ajout de la bibliothèque comme deuxième projet à l'espace de travail. 2. Lier binaire avec les bibliothèques - Ajouter la bibliothèque statique.

-- LA PARTIE IMPORTANTE --

  1. Ajouter ce qui suit aux « Chemins de recherche d'en-tête » dans les paramètres de build

BUILT_PRODUCTS_DIR $

Cela permettra de lier les fichiers d'en-tête intégrés au projet. Plus d'erreurs de build.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X