web-dev-qa-db-fra.com

Quelle est la bonne façon de configurer les espaces de travail XCode 4 pour créer des dépendances en cas de besoin?

Mon cas est simple, un espace de travail avec deux projets frères: une application principale (iOS) et un projet qui construit plusieurs cibles de bibliothèque statiques utilisées par l'application.

Voici comment j'ai configuré la construction:

  • a fait pointer un "chemin de recherche de l'en-tête de l'utilisateur" dans les paramètres de construction de l'application principale vers l'emplacement du projet de bibliothèque (via un arbre source)
  • dans l'éditeur de la cible principale de mon application -> phases de construction -> section "Lier des fichiers binaires avec des bibliothèques", ajout des produits de bibliothèque que je veux utiliser.
  • dans le schéma, cochez la case "Rechercher les dépendances implicites"

Après un nettoyage (et la suppression des données dérivées), une construction corrige cette erreur lors de la construction du projet principal:

ld: library not found for -lChipmunk
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang failed with exit code 1

En effet, si je regarde dans les données dérivées nouvellement créées, les seuls fichiers objets à trouver concernent l’application principale, pas les bibliothèques. Une 'découverte' généralisée pour les fichiers * .o ne révèle rien de pertinent, les bibliothèques ne sont donc pas perdues, elles ne sont certainement pas construites.

Quelques points supplémentaires: 

  • quand j'ai posé la question à ce sujet sur les forums Apple pour les développeurs, il a été suggéré d'ajouter des deps explicites dans l'éditeur Build Phases-> Target Dependencies. Mais vous ne pouvez ajouter ici que des dépendances aux cibles du projet ou des sous-projets same; dans mon cas, j'ai les projets de l'application et de la bibliothèque en tant que frères et sœurs sur le lieu de travail.
  • si je construis chaque bibliothèque manuellement avant la construction principale, tout va bien.

Mettre à jour:

Je viens de trouver une solution de contournement, qui consiste à ajouter toutes les cibles de deps dans la partie "construction" du schéma de l'application principale. J'avais déjà essayé sans succès auparavant, mais je n'avais pas réalisé que je pouvais faire glisser les cibles dans la liste pour obtenir le bon ordre de construction. Les constructions se déroulent maintenant dans le bon ordre, à la fois après un nettoyage et après des modifications apportées à la bibliothèque ou à la source principale de l'application.

Je laisse la question ici, car trier manuellement un ordre de fabrication ne devrait sûrement pas être nécessaire. Il doit y avoir quelque chose qui cloche dans la façon dont les choses sont organisées.

36
Cris

La modification du schéma (permuter entre les cibles de construction, décocher/cocher "Construire en parallèle" et/ou "Rechercher les dépendances implicites") ne fonctionnait pas pour moi. Je devais toujours nettoyer le projet, après tout changement de code dans la bibliothèque statique. En cherchant sur les forums de dev, j'ai finalement trouvé cette réponse , qui a fait des merveilles. 

Assurez-vous que l'inspecteur Identity and Type est affiché et sélectionnez le fichier libWitely.a dans le projet de votre application (pas dans la bibliothèque). Si vous voyez Emplacement: relatif au projet [ou relatif au groupe], c'est votre problème.

  1. Cliquez sur Relative to Project et définissez-le sur Relative to Build Des produits.
  2. Cela changera le type du lien, mais cela restera quand même être brisé.
  3. Cliquez sur le bouton de localisation et recherchez le fichier de sortie.

L'ajout d'une bibliothèque statique à un projet existant via Build Phases -> Link Binary avec Libraries le rend automatiquement "Relatif au groupe" (si les deux sont frères dans le même espace de travail). Changer son emplacement de la manière décrite ci-dessus résout le problème de dépendance de génération et dans le navigateur de projet, votre fichier .a doit apparaître en lettres noires (au lieu de rouge).

41
christoph

J'ai décrit la façon dont j'ai configuré plusieurs projets dans un espace de travail ici: http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/

Je conviens que l'ajustement manuel de l'ordre de construction dans le schéma devrait être inutile, selon la documentation de Xcode, mais c'est la meilleure solution que j'ai trouvée jusqu'à présent.


Edit: Chaque fois que cela est possible, je vous recommande d’utiliser https://github.com/CocoaPods/CocoaPods pour gérer les dépendances de projet à ce stade.

8
Jonah

Essayez de faire glisser le projet de bibliothèque dans le projet principal:

library project reference inside main project

2
Jeffy

Dans mon cas, la seule façon dont je pourrais avoir cette construction de frère est en ajoutant manuellement le chemin "../MyLibProject/build/Debug-iphoneos" (vérification récursive pour en être sûr) dans mes Paramètres de construction -> Chemins de recherche de bibliothèque. L'ajout du fichier .a dans le projet principal seul n'a pas empêché l'erreur "lib introuvable" au moment du lien.

0
Ben G