web-dev-qa-db-fra.com

Comment dois-je gérer les dépendances entre les projets dans un espace de travail Xcode?

Je travaille sur un projet d'application iOS et j'ajoute le projet json-framework à l'espace de travail. Le navigateur de projet sur la gauche affiche les deux projets, et le sélecteur de schéma de construction affiche également les schémas des deux projets. Maintenant, je veux ajouter la cible libjson.a du projet json-framework en tant que dépendance à la cible de l'application iOS dans l'autre projet. Le résultat attendu est que chaque fois que la cible de l'application est créée, elle construit (si nécessaire) la cible de la bibliothèque et lie la cible de l'application à celle-ci. Voici les façons dont j'ai essayé de le faire:

  • Construisez les deux dans le même schéma. La façon dont j'essaie est de modifier le schéma de mon application, en ajoutant "libjson.a" à la partie "Build" du schéma, et en vérifiant "Rechercher les dépendances implicites". Ensuite, je vais dans l'éditeur cible pour ma cible d'application, et dans "Build Phases" -> "Link Binary With Libraries", je choisis 'libjson.a' dans la liste des bibliothèques de l'espace de travail. Lorsque j'essaie par la suite de construire le schéma, je le vois construire la cible de la bibliothèque, mais la construction de la cible de l'application échoue avec l'erreur de l'éditeur de liens "Library not found for -ljson" - suggérant qu'il n'a pas réellement découvert que la bibliothèque a été construite. En effet dans le navigateur de projet, l'entrée sous le projet d'application pour la bibliothèque est toujours rouge indiquant que le fichier n'existe pas.

  • Ajoutez la cible json en tant que dépendance explicite. Pour essayer cela, je ne modifie pas le schéma de construction, mais allez dans l'éditeur de cible pour ma cible d'application et cliquez sur le bouton Ajouter sous 'Dépendances cibles'. Aucune cible provenant d'autres projets dans l'espace de travail n'apparaît, il ne s'agit donc pas d'un démarreur.

  • Faites glisser le projet JSON dans l'autre projet, puis ajoutez la cible en tant que dépendance. C'est ce que j'aurais fait dans Xcode 3. Dans le navigateur de projet, je prends le projet de bibliothèque et le fais glisser sur le projet d'application. Cela fait apparaître le volet habituel "ajouter des fichiers", que je ferme simplement en cliquant sur "Terminer". Il y a maintenant deux entrées pour le projet de bibliothèque dans le navigateur de projet: une au niveau supérieur et une sous le projet d'application. Je peux maintenant ajouter la cible de la bibliothèque en tant que dépendance de la cible de l'application à l'aide de l'éditeur de cible, et je peux la lier sans erreur dans la phase des bibliothèques de liens. Mais ça a l'air cassé: il y a plusieurs entrées pour le même projet dans le navigateur. Existe-t-il une manière différente de procéder?

Que faut-il considérer comme la manière "Xcode 4-ish" de connecter ces cibles dans différents projets dans le même espace de travail? Cela semblerait manquer si plusieurs projets dans le même espace de travail ne peuvent pas réellement interagir les uns avec les autres. Merci, Graham.

59
user23743

Je viens de configurer un projet de test, à peu près comme vous le décrivez dans la version 3, en créant un nouvel espace de travail et en y faisant glisser les deux projets Xcode, imbriqués comme indiqué.

Vous pouvez supprimer le projet frère si vous l'avez déjà.

Frapper s'appuie sur cela et cela fonctionne, pour autant que je puisse voir.

Scheme SettingsProject Layout

J'imagine qu'il y a une confusion de chemin interne si vous avez deux projets, et je serais enclin à jouer avec les paramètres de localisation dans "Affichage" -> "Utilitaires" -> "Inspecteur de fichiers" et voir quel effet cela a.

enter image description hereenter image description here

Une autre chose à essayer est de configurer vos chemins dans Xcode "Préférences ..." -> "Arbres source" et de les consulter de cette manière, comme décrit ici: Partage de code modulaire facile à travers les applications iPhone: bibliothèques statiques et croix -Références du projet

HTH. Andy W.

24
creednmd

J'ai réussi à faire fonctionner les dépendances entre les projets dans un espace de travail comme je l'ai décrit ici: http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode -4 / .

Malheureusement, je ne trouve pas de moyen pour que Xcode découvre les dépendances implicites ou indexe tout dans la build comme annoncé. J'ai trouvé une solution de contournement aux deux, mais j'espère que moins de configuration manuelle sera nécessaire à mesure que Xcode 4 mûrit.

9
Jonah

J'allais poser la même question, pensant que ma propre solution ne pouvait pas être la bonne. Mais je ne vois pas cela mentionné ici, et cela semble fonctionner. Clairement, XCode 4 est un travail en cours. :)

J'ai un espace de travail avec deux projets: une bibliothèque statique et une application qui utilise la bibliothèque. Les projets sont frères et sœurs. Chaque projet a son propre schéma, et chaque schéma est défini pour créer une seule cible. En d'autres termes, j'ai ajouté deux projets à l'espace de travail et c'est tout.

Pour ajouter la bibliothèque statique en tant que dépendance de l'application, je fais simplement glisser le produit libsomething.a du projet de bibliothèque (Project Navigator) dans la liste "Lier le binaire aux bibliothèques" pour la cible de l'application. C'est ça. Maintenant, lorsque je crée l'application, le projet de bibliothèque est d'abord créé, puis lié. Fait intéressant, lorsque je modifie le schéma de l'application pour utiliser une configuration différente (par exemple, Release au lieu de Debug), la bibliothèque est construite en utilisant la même configuration.

Cela fonctionne donc, et il y a clairement une vérification automatique des dépendances en cours ici. Mais ça ne va pas. Là encore, il en va de même pour l'éditeur/gestionnaire de schéma modal et le manque d'objet d'espace de travail dans le navigateur de projet ... Je n'ai jamais pensé le dire, mais l'interface utilisateur de Visual Studio (bleh) est beaucoup plus claire.

1
Tyler Daniel

Ma solution pare-balles pour ce faire:

Créez les paramètres "Par débogage/version/par architecture" dans les paramètres de construction du projet principal (pas la bibliothèque), pour inclure soit ../MyLibProject/build/Debug-iphoneos ou ../MyLibProject/build/Release-iphonesimulator ou etc. ..
en fonction de la configuration (vous pouvez créer ce type de configuration en cliquant sur le + à côté de Debug ou Release et choisissez "Any iOS Simulator SDK" ou "any iOS SDK". Vous devez le faire pour les deux "Chemin de recherche d'en-tête" (au cas où votre bibliothèque copierait certains fichiers d'en-tête, ce qui est plus que probable) ET pour "Chemins de recherche de bibliothèque". Ce qui signifie que pour chaque paramètre, vous vous retrouverez probablement avec 4 chemins différents (débogage sim , debug ios, release sim, release ios). Cela garantirait la configuration des deux projets.

Maintenant, pour compiler automatiquement la lib, c'est-à-dire pour créer la dépendance, vous pouvez utiliser le conseil "Phase de construction -> Lier au binaire avec les bibliothèques -> + -> sélectionner le fichier .a" donné ci-dessus.

C'est la seule façon dont j'ai réussi à avoir quelque chose qui se construit et se lie correctement pour chaque environnement sur xcode 4.5

Remarque: j'ai même ajouté le drapeau -lmyLib dans "autres drapeaux de l'éditeur de liens", mais je ne suis pas sûr que ce soit vraiment nécessaire

1
Ben G

Espace de travail Xcode

Un workspace est un document Xcode qui regroupe des projets et d'autres documents afin que vous puissiez les travailler ensemble. Un espace de travail peut contenir un nombre illimité de projets Xcode, ainsi que tout autre fichier que vous souhaitez inclure. En plus d'organiser tous les fichiers dans chaque projet Xcode, un espace de travail fournit des relations implicites et explicites entre les projets inclus et leurs cibles.

Les espaces de travail étendent la portée de votre flux de travail

Un fichier de projet contient des pointeurs vers tous les fichiers du projet, ainsi que des configurations de construction et d'autres informations sur le projet. Dans Xcode 3 et versions antérieures, le fichier de projet est toujours la racine de la hiérarchie de structure de groupe et de fichier. Bien qu'un projet puisse contenir des références à d'autres projets, travailler sur des projets interdépendants dans Xcode 3 est compliqué; la plupart des workflows sont limités à un seul projet. Dans Xcode 4 et versions ultérieures, vous avez la possibilité de créer un espace de travail pour contenir un ou plusieurs projets, ainsi que tous les autres fichiers que vous souhaitez inclure.

Projets dans un espace de travail Partager un répertoire de construction

Par défaut, tous les projets Xcode d'un espace de travail sont construits dans le même répertoire, appelé répertoire de construction de l'espace de travail. Chaque espace de travail a son propre répertoire de construction. Étant donné que tous les fichiers de tous les projets d'un espace de travail se trouvent dans le même répertoire de génération, tous ces fichiers sont visibles pour chaque projet. Par conséquent, si deux projets ou plus utilisent les mêmes bibliothèques, vous n'avez pas besoin de les copier séparément dans chaque dossier de projet.

Xcode examine les fichiers du répertoire de construction pour découvrir les dépendances implicites. Par exemple, si un projet inclus dans un espace de travail crée une bibliothèque liée par un autre projet dans le même espace de travail, Xcode crée automatiquement la bibliothèque avant de construire l'autre projet, même si la configuration de construction ne rend pas cette dépendance explicite. Vous pouvez remplacer ces dépendances implicites par des paramètres de construction explicites si nécessaire. Pour les dépendances explicites, vous devez créer des références de projet.

Chaque projet dans un espace de travail continue d'avoir sa propre identité indépendante. Pour travailler sur un projet sans affecter ou être affecté par les autres projets de l'espace de travail, vous pouvez ouvrir le projet sans ouvrir l'espace de travail, ou vous pouvez ajouter le projet à un autre espace de travail. Étant donné qu'un projet peut appartenir à plusieurs espaces de travail, vous pouvez travailler sur vos projets dans un nombre illimité de combinaisons sans avoir à reconfigurer aucun des projets ou espaces de travail.

Dans XCode 4, l'idée d'espaces de travail est censée remplacer la fonctionnalité de XCode 3s cross-project references[Sur] En savoir plus ici

0
yoAlex5

J'ai réussi à créer bibliothèques statiques de type framework , bien que ce ne soit pas une solution parfaite.

0
amrox