web-dev-qa-db-fra.com

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

J'ai un projet dans Xcode 4 (la dernière version non bêta) qui fonctionne bien lorsqu'il est intégré à Xcode lui-même. Plus précisément, la commande Ld utilise correctement le répertoire de données dérivé (où sont placés les produits de construction, y compris une bibliothèque statique dépendante).

Toutefois, lorsque je crée le même projet à partir de la ligne de commande, la commande Ld échoue car elle tente d'utiliser le dossier/build du projet, qui n'est pas renseigné.

J'ai essayé d'ajuster chaque paramètre de construction que je connaisse, à la fois dans le projet parent et le projet dépendant.

Des idées sur où commencer à déboguer ceci? Je peux fournir plus d'informations au besoin.

Edition 1: Commande de construction complète Xcode:

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

AppName et Config Name sont les deux valeurs correctes pour la construction.

Edit 2: Link (Ld) commandes.

Quand 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

Construit à partir de la ligne de commande en utilisant la commande de construction ci-dessus (cela échoue):

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 retourne:

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
37
James J

Hier, j'ai rencontré le même problème et j'ai pu résoudre le problème. Pour tenter de cerner ce qui a fonctionné pour James, je vais indiquer ce que je devais faire. J'ai dû ajouter un espace de travail et passer à l'exécution de xcodebuild avec workspace/scheme au lieu de project/target. 

L'utilisation de workspace/scheme a forcé xcodebuild à utiliser le dossier DerivedData au lieu du dossier de sortie de la construction sous le projet principal. Cela a permis à l'éditeur de liens de trouver la bibliothèque statique associée.

Ce blog a été extrêmement utile:

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

10
bromanko

J'ai eu cette erreur lorsque j'ai essayé 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.

4
Popeye

Vérifiez si vous n'avez pas importé les fichiers .m dans vos fichiers d'en-tête! Changer de .m à .h a résolu ce problème pour moi!

2
nemesis

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

2
uneakharsh

Si vous consultez le journal de la construction, demandant à voir tous les messages, vous devriez voir une ligne laconique qui dit "lien ..." et qui contient peu de détails. Toutefois, si vous cliquez avec le bouton droit de la souris sur cette ligne et que vous sélectionnez "développer toutes les transcriptions", vous obtenez une ligne très détaillée vous indiquant quelle commande a été émise depuis XCode. 

Cela devrait vous aider à résoudre le problème.

Dave

1
Dave Stampf

J'ai eu une exception similaire rencontrée, Il s'est avéré que j'ai obtenu une référence (null) dans project.pbxproj Après avoir nettoyé ces références null dans le project.pbxproj, la construction en ligne de commande a été un succès xcode précédemment fait . Regardez Xcode 4 project: utilitaire pour nettoyer le fichier pbxproj? utility-to-clean-up-pbxproj-file

pour plus de référence

1
laiBilly

Je résous le problème en allant dans "Chemin de recherche de la bibliothèque" et en vérifiant que toutes les entrées sont correctes.

0
Paul

Tout à coup, j'ai eu le même problème après un nettoyage. Au début, j'ai paniqué quand j'ai regardé:

linker command failed with exit code 1 (use -v to see invocation)

... mais cela s’est avéré très facile à corriger, aucune ligne de commande n’a été nécessaire!

J'ai cliqué sur la racine de mon projet (celle du haut avec l'icône du plan avec un "A") dans le navigateur, puis j'ai cliqué sur la section PROJET (vous pouvez aussi cliquer sur la section CIBLE), puis sur le bouton en bas. -moyen appelé "Valider les paramètres".

XCode a lui-même validé les fichiers du projet et m'a dit que le problème était une définition de cible dupliquée et a proposé de le résoudre ... et voilà, le problème est parti!

Bonne chance!

0
Oscar Salguero

Personnellement, j'ai eu ce problème lorsque je développais un static library. J'avais la cible static library avec tout le code de production et une cible de test qui intégrait le fichier MyStaticLib.a en tant que cadre.

Les tests se sont bien déroulés dans Xcode, mais pas dans le terminal avec xcodebuild. Le problème était que la cible static library était en train de compiler pour Standard architectures, alors que la cible de test voulait compiler pour Standard architectures (including 64-bit). Basculer la cible de test sur Standard architectures a tout corrigé.

0
marklar