37 votes

Xcode 4 build réussit, build en ligne de commande échoue?

J'ai un projet dans Xcode 4 (la dernière version non-beta) qui s'appuie amende lorsque construit dans Xcode lui-même. Plus précisément, le Ld de commande utilise correctement les données dérivées du répertoire (où construire des produits, y compris la charge statique de la bibliothèque, sont placés).

Cependant, quand je construire le projet à partir de la ligne de commande, la Ld, la commande échoue, c'est d'essayer d'utiliser le /dossier de création dans le cadre du projet, ce qui n'est pas remplie.

J'ai essayé le réglage de chaque paramètre de construction je connais, à la fois dans le père et le projet dépendant.

Toutes les idées sur l'endroit où démarrer le débogage cela? Je peux fournir plus d'informations que nécessaire.

Edit 1: Plein Xcode commande build:

xcodebuild -project AppName.xcodeproj -target AppName -configuration "Config Name"

AppName et Config Name sont à la fois les valeurs correctes pour le construire.

Edit 2: Liaison (Ld) de commandes.

Lorsque construit dans Xcode (cela fonctionne):

Ld /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator/AppName.app/AppName normal i386
cd /Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName
setenv MACOSX_DEPLOYMENT_TARGET 10.6
setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/usr/local/git/bin"
/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -L/Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator -L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName -F/Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator -filelist /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/Objects-normal/i386/AppName.LinkFileList -mmacosx-version-min=10.6 -lxml2 -all_load -ObjC -licucore -Xlinker -objc_abi_version -Xlinker 2 -lMyClientLibrary -lxml2 -lsqlite3.0 -framework Security -framework MessageUI -framework QuartzCore -framework MediaPlayer -framework MapKit -framework CoreLocation -framework AudioToolbox -lz.1.2.3 -framework MobileCoreServices -framework SystemConfiguration -framework CFNetwork -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator/AppName.app/AppName

Lors de la construction de la ligne de commande utilisez la commande ci-dessus (échec):

Ld "build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName" normal armv6
cd /Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName
setenv IPHONEOS_DEPLOYMENT_TARGET 4.0
setenv PATH "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/X11/bin:/opt/local/bin"
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk "-L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/Prod Ad Hoc-iphoneos" -L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName "-F/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/Prod Ad Hoc-iphoneos" -filelist "/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName.LinkFileList" -dead_strip -lxml2 -all_load -ObjC -licucore -miphoneos-version-min=4.0 -lMyClientLibrary -lxml2 -lsqlite3.0 -framework Security -framework MessageUI -framework QuartzCore -framework MediaPlayer -framework MapKit -framework CoreLocation -framework AudioToolbox -lz.1.2.3 -framework MobileCoreServices -framework SystemConfiguration -framework CFNetwork -framework UIKit -framework Foundation -framework CoreGraphics -o "/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName"

Qui renvoie:

ld: library not found for -lMyClientLibrary
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

42voto

James J Points 3589

Ok, c'est donc près de 6 (facturable) heures plus tard, j'ai obtenu la compilation fonctionne correctement dans Xcode et sur la ligne de commande (et sur le serveur de build, le point de l'ensemble de cet exercice).

Le long de la façon dont je voudrais corriger un problème juste à cause d'un autre - je ne souhaite apparemment correctif de l'éditeur de liens/Ld problème, seulement de causer des problèmes lors de la compilation ("SomeClass non déclaré (première utilisation dans cette fonction)" ou "SomeHeader.h: Aucun fichier ou répertoire" des erreurs ont été commun).

C'était un de ces moments que j'ai ajusté près de tous les paramètres que j'ai pu trouver, il est donc difficile de dire exactement de quoi de mal et ce qu'il fixe.

Des choses que je pense pourrait avoir aidé sont comme suit:

  • Converti construction à utiliser un Xcode espace de travail & (au lieu de projet & cible)
  • Réarrangés de l'espace de travail de l'Application du projet et statique de la bibliothèque en tant que frères et sœurs (pas en tant que parent/enfant)
  • Changé Xcode et de l'espace de travail de paramètres pour l'utilisation de construire des emplacements spécifiés dans les objectifs
  • Changement de Produits de construction de Chemin d'accès pour l'Application et la Bibliothèque à utiliser ../construire (à la fois les fichiers de projet sont contenues dans la fratrie sous-dossiers d'un répertoire principal, alors le fait de les intégrer dans le même dossier résolu à l'origine de l'éditeur de liens/Ld problème de la commande, je pense)
  • Édité le App régime explicitement la construction de la Bibliothèque de la cible, et de le construire avant l'Application cible
  • Dans les Phases de construction de l'Application cible, ajouter explicitement la Bibliothèque, sous "Lien Binaire Avec les Bibliothèques"
  • Changer le type d'emplacement de la Bibliothèque .un fichier de référence "par rapport aux Produits de construction"
  • Ajout d'une "Copie des en-Têtes" phase de construction de la Bibliothèque de projet, a ajouté les en-têtes appropriés à la section Publique
  • Changé les en-Têtes Publics Chemin d'accès au Dossier du projet de la Bibliothèque de "/include"
  • Changé le Répertoire d'Installation de la Bibliothèque en $(BUILT_PRODUCTS_DIR)
  • Changé la Bibliothèque des Chemins de Recherche et de l'Utilisateur en-Tête des Chemins de Recherche de l'Application cible d' $(BUILT_PRODUCTS_DIR) (récursif)
  • Ajout d'une commande Nettoyer avant de le construire sur mon serveur de build Jenkins
  • Ajouté explicite SDK et la Voûte des arguments à la commande de construction
  • Supprimé les espaces de construire le nom de la configuration

Finale de la commande ressemble à ceci:

xcodebuild -workspace ClientName.xcworkspace -scheme AppName -configuration "ProdAdHoc" -sdk iphoneos -arch "armv6 armv7"

Quelques ressources utiles, j'ai utilisé pendant le débogage de ce problème:

De toute façon, j'espère que j'ai parsemé assez de mots clés ci-dessus que quelqu'un qui a une même construction de problèmes dans le futur tombe sur ce, et il juge utile. Je n'ai aucune idée de comment un flux de travail j'ai fait de nombreuses fois dans Xcode 3.x s'est tellement foiré quand j'ai déménagé à Xcode 4, en espérant qu'Apple est capable de nettoyer ce dans les futures versions.

C'était une sacrée expérience d'apprentissage pour moi, et passe au travers de tout cela ne semble pas clair problèmes avec la saisie semi-automatique, j'avais eu à l'avance. Je vais dire les choses auraient pu être bien pire, je pourrais encore en développement pour SharePoint.

10voto

bromanko Points 511

J'ai couru à la même question hier et a été en mesure de s'en sortir. Dans un effort pour affiner ce qui a fonctionné pour James, je vais le point à ce que j'avais à faire. J'ai dû ajouter un espace de travail et de passer à l'exécution de xcodebuild avec espace de travail/système au lieu du projet/de la cible.

À l'aide de l'espace de travail/régime forcé xcodebuild d'utiliser le DerivedData dossier au lieu de la sortie de la construction sous-dossier principal du projet. Cela a permis à l'éditeur de liens pour trouver l'associé bibliothèque statique.

Ce blog a été très utile:

http://blog.carbonfive.com/2011/05/04/automated-ad-hoc-builds-using-xcode-4/

4voto

Popeye Points 5478

J'ai eu cette erreur lorsque j'essayais avec mes fichiers, j'ai ajouté le @implementation au fichier .h et laissé le fichier .m vide. Je ne crois pas que ce soit votre erreur, mais si quelqu'un d'autre le comprend, vérifiez que vous ne l'avez pas déjà fait.

2voto

nemesis Points 589

Vérifiez si vous n'avez pas importé les fichiers .m dans vos fichiers d'en-tête! Changer .m en .h a corrigé cela pour moi!

2voto

uneakharsh Points 369

Je ne sais pas si cela fonctionnera pour vous, mais dans mon cas, j'avais plus d'un fichier main.m . Tout ce que j'avais à faire était de détacher l'un des main.m de la cible et cela a fonctionné. Assurez-vous de ne pas avoir plus d'un main.m dans votre projet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X