Xcode version personnalisée de configuration causes “de la bibliothèque/fichier non trouvé” pour les bibliothèques statiques
J'ai un espace de travail avec un projet dont les liens avec les bibliothèques statiques dans un autre projet (qui est aussi dans l'espace de travail). C'est un problème dans Kobold2D je n'ai pas été en mesure de résoudre, même si je comprends la cause, et je suppose que c'est semblable à cette question.
Les objectifs du projet et la bibliothèque statique cibles ont tous le Debug et Libération construire des configurations. Tout est bien.
Maintenant, quelqu'un ajoute une nouvelle configuration de build dans le projet et les noms qu'il Ad-Hoc par exemple. Maintenant la cible du projet s'appuie la Ad-Hoc de configuration, cependant les bibliothèques statiques n'ont pas cette configuration. Apparemment ils ont alors par défaut à la construction de l' Libération de configuration.
À la fin, lorsque l'éditeur de liens est censé réunir tout, il échoue:
ld: library not found for -lbox2d-ios
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang++ failed with exit code 1
De force bibliothèques chargées via -force_load $(BUILT_PRODUCTS_DIR)/libSomeLib.a
l'erreur est similaire, mais dit "fichier non trouvé". Il est à noter que la bibliothèque "libbox2d-ios.un" est dans le "lien binaire avec les bibliothèques" phase de construction de la liste.
Évidemment, le problème, c'est que l'éditeur de liens est en supposant que les bibliothèques sont dans le Ad-Hoc-iphoneos dossier dans le BUILT_PRODUCTS_DIR alors qu'ils sont en fait dans le de presse-iphoneos dossier car ils n'ont pas Ad-Hoc de configuration de la compilation.
Comment puis-je claque de l'éditeur de liens dans le visage et de lui dire à obtenir les bibliothèques où ils sont? De préférence, je suis à la recherche d'une solution qui fonctionne pour les deux cas, c'est à dire les bibliothèques ajouté la manière standard (lien binaire avec les bibliothèques phase de construction) et les bibliothèques qui ont besoin d'une autre -force_load de travail.
J'espère qu'il y a d'une certaine façon à:
- force bibliothèques à être placé dans la configuration de build dossier de l'application cible
- exécuter un post-compiler & pré-lien de script qui copie chaque bibliothèque à la configuration de build dossier
- spécifier un chemin relatif aux bibliothèques
- utiliser une autre macro autre que $BUILT_PRODUCTS_DIR pour -force_load
- un linker drapeau comme -WTFmake-tous-les problèmes-go-away
Excusez-moi, mais je dois dire que cette ... ARGH! 🙂
- Hehe! ARGH trop!
- ARGH!!! en effet (rageguy)
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas trouvé le moyen de le faire, malheureusement. La meilleure solution je trouve, c'est pour ajouter de nouvelles cibles plutôt que de construire des configurations. Ainsi, par exemple dans un de mes projets j'ai seulement Release et Debug configurations, mais j'ai supplémentaires cibles appelée "MyProject - app store" et "MyProject - ad-hoc". Cela ne sera possible que si vous avez le contrôle du fichier de projet, bien sûr.
Avoir dupliqué cibles assis autour est ennuyeux à l'extrême parce que vous pouvez ajouter des fichiers à une cible et d'oublier de les ajouter aux autres, et vous ne saurez pas jusqu'à ce que vous essayez de construire. Mais il ne fait construire, ce qui est une victoire (avec xcode de toute façon).
Une question similaire, j'ai demandé tout à l'heure: Quelle est la bonne manière de définir des configurations de build dans un projet ios à l'aide de bibliothèques statiques pour la création d'une archive dans xcode 4?
Comme dit dans la question similaire iOS Bibliothèque Statique comme un sous-projet d'un Projet de construction Personnalisé Configurations?, la solution est d'ajouter cette ligne
$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
à votre cible
Framework Search Paths
,Header Search Paths
et/ouLibrary Search Paths
Voici quelque chose qui fonctionne pour moi.
Dans le projet avec le Adhoc de configuration de la compilation, remplacer les "Par-configuration des Produits de construction de Chemin d'accès" (CONFIGURATION_BUILD_DIR) et "Par-configuration Intermédiaire Fichiers de Build Path" (CONFIGURATION_TEMP_DIR) pour les ad Hoc de la configuration de build à utiliser le même dossier que la configuration de version.
Maintenant, quand vous faites une Adhoc construire, Xcode va mettre libtruc.un et Barre.application dans le Presse-iphoneos dossier. L'éditeur de liens seront heureux et vous pouvez les utiliser -force_load $(BUILT_PRODUCTS_DIR)/libtruc.une comme d'habitude.
Alternativement, vous pouvez ajouter de la Libération-iphoneos dossier à la bibliothèque des chemins de recherche pour les ad Hoc de la configuration de build:
Mais vous aurez à définir un autre -force_load pour chaque configuration de build:
J'ai un problème similaire à l'aide de CocoaPods et en essayant d'avoir plus d'un Adhoc (ou de l'Entreprise, ou Bêta) configurations.
Voici ce qui semble fonctionner (disons que les deux projets sont couchés dans le même xcworkspace):
Ajouter le
subproject
généré lib à lamainproject
Lien Binaire avec les Bibliothèques.Que la configuration
Adhoc
n'est pas connu par lesubproject
, Xcode va utiliser leRelease
config comme une solution de repli (ou peut-être la première config de la liste) lors de sa construction.L'éditeur de liens se plaindre parce qu'il ne trouve pas la lib... ok, nous allons gérer cela.
Ajouter un Exécuter le Script phase de construction de la
mainproject
, juste après la Cible des Dépendances de phase. Entrer ce script:Cela va copier le répertoire " lib " généré par le
subproject
Release
construire (qui va se passer quandmainproject
est construit) dans leAdhoc
répertoire de construction, de sorte que l'éditeur de liens se trouver la lib. Et nous devrions être bon d'aller! Ouais!Mon cadre est construit en utilisant un autre projet SDK à l'intérieur de mon projet d'application. D'abord j'ai un "Debug" et "Release", puis-je ajouter un nouveau "TestFlight" de configuration. Je ne peux pas l'archive avec un nouveau. J'ai fini par l'ajout d'une nouvelle configuration de la compilation du même nom dans le kit de développement de projet. En d'autres termes, j'ai fini par l'ajout de "TestFlight" configuration de mon application et kit de développement de projets. Maintenant Archive fonctionne.
Je ne suis pas sûr si c'est la meilleure façon de le faire. Mais il a l'air assez propre pour moi pour l'instant. 🙂
Oh, et pour Cocoapods, après vous dupliquer la configuration, si vous exécutez
pod install
tout de suite, vous aurez cet avertissement jaune:Vous devez aller pour le Projet, onglet "Info", "Configurations" de la section, sélectionnez la nouvelle configuration que vous venez de créer, et de définir des "Pods".libération" de toutes les cibles à "None" premier. Après cela, vous pouvez exécuter
pod install
en toute sécurité.Vous pouvez ajouter CONFIGURATION_BUILD_DIR=/Certains/Shared/Dir avant d'exécuter xcodebuild. Par exemple:
Généralement, j'ai un
AppStore
régime (mappé à monAppStore
config).Une chose qui m'est arrivé, ce cas a été sensible à la question qui a été prise de Cocoapods pour générer un dossier de création pour
Pods.build
à l'intérieur deRelease-iphonesimulator
(comme un secours) au lieu deAppStore-iphonesimulator
.Je suppose que je miss-clic quand j'ai relié le système et de configuration et seulement de les enlever et de le rajouter m'a fait comprendre ce qui s'est passé. De vérifier la diff.
J'ai été en utilisant cocoapods 0.38.2, donc c'était clairement un utilisateur mal de configuration et pas un Cocoapods problème qui a été réglé sur 0.34