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:
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:
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.
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.
- Cliquez sur Relative to Project et définissez-le sur Relative to Build Des produits.
- Cela changera le type du lien, mais cela restera quand même être brisé.
- 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).
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.
Essayez de faire glisser le projet de bibliothèque dans le projet principal:
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.