web-dev-qa-db-fra.com

Bibliothèques statiques dans Xcode 4

(Ma question a déjà été posée ici, mais je n'ai pas trouvé de réponses utiles. Par exemple Xcode4 Workspace avec projet de bibliothèque statique et projet d'application )

J'essaie d'utiliser une bibliothèque fournie par un tiers. Ils fournissent le projet XCode qui construit un fichier libLibraryName.a. Ils recommandent d'ajouter le projet en tant que sous-projet au mien, puis d'ajouter le produit libLibraryName.a au jeu de bibliothèques décrit dans les paramètres de mon projet "Lier le binaire aux bibliothèques".

La bibliothèque se construit correctement: le fichier .a est généré. Mais le projet affiche un fichier rouge libLibraryName.a sous le groupe Produits. Je n'arrive pas à le faire noircir. Et le projet parent dit qu'il ne trouve pas LibraryName pour la liaison.

Comme test, j'ai créé un nouveau projet de bibliothèque statique en utilisant le modèle de bibliothèque statique XCode 4. Ce projet présente le même comportement - le produit ne s'affiche jamais "noir" même si le fichier .a est créé. ( Edit: il devient noir si vous construisez pour un appareil, pas un simulateur).

Je sais que XCode 4 place les fichiers intermédiaires et produits par défaut dans un emplacement partagé. J'ai essayé ce paramètre et j'ai modifié le paramètre pour placer les fichiers du produit dans les dossiers décrits dans les paramètres de génération. Aucun des deux paramètres ne fonctionne.

Les gens ont également suggéré de construire un appareil plutôt qu'un simulateur. J'ai essayé cela en vain.

Ce qui donne? Comment puis-je obtenir un projet de bibliothèque statique pour reconnaître où il a construit le produit et référencer ensuite ce produit dans un autre projet?

41
TomSwift

Beaucoup de sauts de cerceau, mais voici mes notes maintenant que je l'ai fait fonctionner.

  • Si vous créez un nouveau projet XCode4 iOS "Cocoa Touch Static Library" (et y ajoutez du code), le projet se développera correctement hors de la boîte. Mais le fichier produit libLibraryName.a ne devient noir (du rouge, indiquant que le fichier n'existe pas) que lorsque vous effectuez une construction de périphérique. Une construction de simulateur ne montre pas que la cible a été construite alors qu'elle l'était.

  • Dans les paramètres de build de la cible du projet, le "Chemin des produits de construction par configuration" est par défaut $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) Si vous le changez en quelque chose d'autre (ou si vous avez mis à niveau le projet à partir de XCode3.x qui utilisait $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)$(IPHONEOS_DEPLOYMENT_TARGET) par défaut, je crois), puis le fichier produit libLibraryName.a ne deviendra jamais noir. Pour moi, cela signifie qu'il y a un bug dans XCode quelque part.

  • Je peux vivre sans que le fichier produit noircisse après une build (c'est un bon indicateur, mais bon, peu importe.) Mais j'ai besoin de mon projet consommateur pour pouvoir trouver la build correcte de la bibliothèque, que ce soit pour un simulateur ou un appareil . Dans un monde idéal, il y aurait un seul fichier .a contenant des bits i386/arm6/arm7, mais encore une fois, ce n'est pas mon projet de bibliothèque/bibliothèque.

  • Le XCode4 Transition Guide est ce qui m'a montré la lumière. Il prescrit la création d'un espace de travail qui héberge les deux projets, et ils seront tous deux intégrés dans le même répertoire de génération partagé. Je n'utilisais pas d'espace de travail auparavant, j'ai donc utilisé la commande Fichier/Enregistrer sous espace de travail pour créer le nouveau fichier d'espace de travail. Ensuite, j'ai ajouté le projet de bibliothèque, en veillant à ce qu'il soit placé en tant que pair dans mon projet principal et non en tant qu'enfant.

  • Je devais m'assurer que l'espace de travail était configuré pour placer la sortie de build dans un dossier commun. Dans la boîte de dialogue Paramètres de l'espace de travail, définissez le paramètre Emplacement de génération sur "Placer les produits de construction dans l'emplacement des données dérivées"

  • J'ai également dû m'assurer de cocher la case "partagé" pour chaque projet dans la boîte de dialogue Gérer les schémas.

  • Enfin, pour spécifier la dépendance de la bibliothèque pour mon projet principal, je suis simplement allé dans l'onglet Build Phases cible, lier la section Binaires avec les bibliothèques, et j'ai cliqué sur le '+', puis sélectionné le libLibraryName.a fichier sous le dossier Workspace. Notez que j'avais déjà essayé cela quand il n'y avait pas d'espace de travail et pas de répertoire de construction commun, et le résultat était que XCode n'a pas pu trouver le fichier .a pendant le lien.

Tout compte fait, cela fonctionne comme un charme. Je ne peux pas m'empêcher de penser que cela devrait être beaucoup plus facile - comme je pense que c'était dans XCode3.

Je serais heureux de lire l'expérience de quelqu'un d'autre avec tout cela, ou tout commentaire sur d'autres façons (plus simples?) De faire en sorte que la liaison de bibliothèques statiques fonctionne bien.

55
TomSwift

Découvrez ma réponse ici et voyez si cela vous aide:

Lier une bibliothèque statique à un projet iOS dans XCode 4

Ceux-ci sont basés sur mes instructions pour ma propre bibliothèque. Je pense que l'étape manquante dans votre processus d'origine est que vous n'ajoutez pas la bibliothèque statique à votre projet d'application en tant que dépendance cible (étape 3 de mes instructions) en même temps que vous la liez dans "Lier le binaire aux bibliothèques". Vous devrez peut-être également effectuer l'étape # 5 selon la façon dont les en-têtes sont liés par le projet de bibliothèque statique.

Lorsque je fais ce processus avec mes propres applications qui ont des références croisées à des projets de bibliothèque statique, il a en fait une étape de moins que le processus équivalent dans Xcode 3.

6
Halle

Jetez un oeil à mes note de solution et entrée Open Radar .

Le nœud de produit de couleur rouge est un bogue de Xcode. Vous pouvez le faire fonctionner en modifiant SDKROOT on Project setting build build. Target les paramètres de construction ne fonctionneront pas pour IDE affichage et support.

Éditer

Pour référence ultérieure.

Actuellement, mon avis est changé pour le Xcode projet n'est pas complètement capable de gérer plusieurs plates-formes. Bien qu'il puisse afficher plusieurs plates-formes mais une seule plate-forme peut être choisie à la fois pour afficher l'écran par le paramètre SDKROOT. Si vous sélectionnez iOS, il utilisera quelque chose comme Debug-iphoneos pour créer le chemin du produit. Ainsi, toutes les cibles Mac OS X seront manquantes. Si vous choisissez Mac OS X, il utilisera quelque chose comme Debug. Ainsi, tous les produits des cibles iOS seront manquants.

Je pense que Xcode a toujours un bug interne lié à cela. Il faut beaucoup de temps pour stabiliser Xcode.

3
Eonil

J'ai eu le même problème avec mon équipe. L'un des développeurs souffrait de ce problème, mais mon xcode a pu compiler et trouvé correctement l'en-tête. BTW: tous les "Paramètres de construction" ont été correctement configurés (recherchez toujours les chemins utilisateur, les chemins d'en-tête utilisateur, etc.).

J'ai réalisé que son projet se trouvait dans un répertoire avec des espaces sur son chemin (../mon projet/blah.xcodeproj). En changeant cela, Xcode a pu trouver les en-têtes de la bibliothèque statique dans le même espace de travail.

Soyez juste conscient des noms de répertoire. Mes deux centimes

2
Diego Marafetti

Un détail de clarification (après avoir fouillé la sortie de la construction jusqu'à ce que je commence à croiser les yeux): si vous trouvez que les en-têtes de votre bibliothèque sont exportés vers Build/Products/Debug et votre projet parent recherche dans Build/Products/Debug-iphonesimulator, votre bibliothèque est en cours de création pour OS X, pas pour iOS. Vous pouvez modifier cela dans le paramètre "Plates-formes prises en charge" dans la section "Architectures" des paramètres du projet. OS X semble être le paramètre par défaut si vous créez un projet de bibliothèque statique Vanilla C++, donc cette situation est assez facile à rencontrer.

1
Tim Keating