web-dev-qa-db-de.com

Xcode 4-Build ist erfolgreich, Befehlszeilen-Build schlägt fehl?

Ich habe ein Projekt in Xcode 4 (der neuesten Nicht-Betaversion), das sich gut in Xcode selbst zusammensetzt. Insbesondere verwendet der Befehl Ld das abgeleitete Datenverzeichnis (wo Build-Produkte einschließlich einer abhängigen statischen Bibliothek abgelegt werden).

Wenn ich dasselbe Projekt von der Befehlszeile aus erstellen, schlägt der Ld-Befehl jedoch fehl, da versucht wird, den Ordner/build innerhalb des Projekts zu verwenden, das nicht gefüllt wird.

Ich habe versucht, jede Build-Einstellung anzupassen, die ich kenne, sowohl im übergeordneten als auch im abhängigen Projekt.

Irgendwelche Ideen, wo Sie mit dem Debuggen beginnen können? Ich kann weitere Informationen zur Verfügung stellen.

Edit 1: Full Xcode Build-Befehl:

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

Dabei sind AppName und Config Name die korrekten Werte für den Build.

Edit 2: Link (Ld) -Befehle.

Wenn Xcode eingebaut ist (das funktioniert):

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

Bei der Erstellung über die Befehlszeile mit dem obigen Buildbefehl (dies schlägt fehl):

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"

Welche gibt zurück:

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

Ok, also fast 6 (abrechenbare) Stunden später, habe ich den Build in Xcode und auf der Kommandozeile (und auf dem Build-Server, der ganze Sinn dieser Übung) richtig funktionieren lassen.

Auf dem Weg würde ich ein Problem beheben, nur um ein anderes zu verursachen - ich würde offenbar das Linker/Ld-Problem beheben, nur um Probleme beim Kompilieren zu verursachen ("SomeClass undeclared (erste Verwendung in dieser Funktion))" oder "SomeHeader.h: Keine solche Datei oder Verzeichnis "Fehler waren üblich).

Es war eine dieser Zeiten, an denen ich fast jede Einstellung angepasst habe, die ich finden konnte. Daher ist es schwer zu sagen, was genau falsch ist und was genau behoben wurde. 

Dinge, die ich denke, möglicherweise haben geholfen, sind wie folgt:

  • Konvertierter Build zur Verwendung eines Xcode-Arbeitsbereichs und -schemas (anstelle von Projekt und Ziel)
  • Arbeitsbereich wurde umgestaltet, um das App-Projekt und die statische Bibliothek als gleichgeordnete Objekte anzuzeigen (nicht als übergeordnetes/untergeordnetes Element)
  • Xcode- und Workspace-Einstellungen geändert, um die in den Zielen angegebenen Build-Positionen zu verwenden
  • Ändern Sie den Build Products-Pfad für App und Library, um ../build zu verwenden (beide Projektdateien befinden sich in gleichgeordneten Unterordnern eines Master-Verzeichnisses. Wenn Sie also in denselben Ordner einbauen, wurde das ursprüngliche Linker/Ld-Befehlsproblem gelöst, ich denke.))
  • Das App-Schema wurde so bearbeitet, dass das Bibliotheksziel explizit erstellt und vor dem App-Ziel erstellt wird
  • Fügen Sie in den Erstellungsphasen für das App-Ziel die Bibliothek explizit unter "Verknüpfung von Binärdateien mit Bibliotheken" hinzu.
  • Ändern Sie den Ortstyp der .a-Dateiverweise der Bibliothek in "Relativ zu Build-Produkten".
  • Fügte dem Bibliotheksprojekt eine Erstellungsphase "Kopfzeilen kopieren" hinzu und fügte die entsprechenden Kopfzeilen zum öffentlichen Abschnitt hinzu
  • Der Pfad für den Public Headers-Ordner des Bibliotheksprojekts wurde in "/ include" geändert.
  • Das Installationsverzeichnis der Bibliothek wurde in $(BUILT_PRODUCTS_DIR) geändert.
  • Die Suchpfade für die Bibliothek und die Suchpfade für die Benutzerkopfzeile des App-Ziels wurden in $(BUILT_PRODUCTS_DIR) (rekursiv) geändert.
  • Vor dem Build auf meinem Jenkins Build Server wurde ein Clean-Befehl hinzugefügt
  • Dem Build-Befehl wurden explizite SDK- und Arch-Argumente hinzugefügt
  • Leerzeichen aus Build-Konfigurationsname entfernt

Der letzte Buildbefehl sieht folgendermaßen aus:

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

Einige nützliche Ressourcen, die ich beim Debuggen dieses Problems verwendet habe:

Wie dem auch sei, ich hoffe, ich habe genug Keywords darüber gepfeffert, dass jeder, der ähnliche Build-Probleme in der Zukunft hat, darüber stolpert und es für nützlich hält. Ich habe keine Ahnung, wie ein Workflow, den ich oft in Xcode 3.x gemacht habe, so verwirrt war, als ich zu Xcode 4 wechselte. Ich hoffe, Apple kann dies in zukünftigen Versionen aufräumen.

Dies war für mich eine echte Lernerfahrung, und bei all dem schien das Problem der Autovervollständigung, die ich zuvor hatte, zu klären. Ich werde sagen, die Dinge hätten viel schlimmer sein können; Ich könnte noch für SharePoint entwickeln.

42
James J

Gestern bin ich zu demselben Thema gekommen und konnte es ausarbeiten. Um einzugrenzen, was für James funktioniert hat, zeige ich auf das, was ich tun musste. Ich musste einen Arbeitsbereich hinzufügen und zur Ausführung von xcodebuild mit Arbeitsbereich/Schema anstelle von Projekt/Ziel wechseln. 

Die Verwendung von Workspace/Schema zwang xcodebuild, den Ordner DerivedData anstelle des Build-Ausgabeordners unter dem Hauptprojekt zu verwenden. Dadurch konnte der Linker die zugehörige statische Bibliothek finden.

Dieser Blogeintrag war äußerst hilfreich:

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

10
bromanko

Ich habe diese Fehlermeldung erhalten, als ich mit meinen Dateien experimentierte. Ich füge die @ Implementierung zur .h-Datei hinzu und ließ die .m-Datei leer. Ich glaube nicht, dass es sich hierbei um Ihren Fehler handelt, aber wenn jemand anderes es bekommt, prüfen Sie vielleicht, ob Sie das nicht getan haben.

4
Popeye

Prüfen Sie, ob Sie die .m-Dateien nicht in Ihre Header-Dateien importiert haben! Das Ändern von .m zu .h hat dieses Problem behoben.

2
nemesis

Ich weiß nicht, ob dies für Sie funktioniert, aber in meinem Fall hatte ich mehr als eine main.m-Datei. Ich musste nur einen der main.m vom Ziel entfernen und es funktionierte. Stellen Sie sicher, dass Sie nicht mehr als einen main.m in Ihrem Projekt haben.

2
uneakharsh

Wenn Sie sich das Protokoll des Builds ansehen und nach allen Nachrichten fragen, sollten Sie eine knappe Zeile mit der Aufschrift "link ..." sehen, die wenig Details enthält. Wenn Sie jedoch mit der rechten Maustaste auf diese Zeile klicken und "Alle Transkripte erweitern" auswählen, erhalten Sie eine sehr detaillierte Zeile, die Ihnen mitteilt, welcher Befehl innerhalb von XCode ausgegeben wurde. 

Das sollte Ihnen helfen, das Problem zu debuggen.

Dave

1
Dave Stampf

Ich hatte eine ähnliche Ausnahme, Es stellte sich heraus, dass ich eine (null) Referenz in project.pbxproj bekam Nachdem ich diese Nullreferenz in der project.pbxproj aufgeräumt hatte, war der Befehlszeilen-Build genauso wie der xcode macht vorher . Schauen Sie sich das Xcode 4-Projekt an: Dienstprogramm zum Bereinigen der pbxproj-Datei? Utility-to-clean-up-pbxproj-Datei

für mehr referenz

1
laiBilly

Ich löse das Problem, indem Sie auf "Bibliothekssuchpfad" gehen und sicherstellen, dass alle Einträge korrekt sind.

0
Paul

Plötzlich bekam ich nach einem Clean das gleiche Problem, zuerst geriet ich in Panik, wen ich sah:

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

... aber es war wirklich einfach zu beheben, keine Befehlszeile nötig!

Ich habe im Navigator auf das Stammverzeichnis meines Projekts (das obere mit dem Blueprint-Symbol mit "A") geklickt, dann auf den Abschnitt PROJECT geklickt (Sie können auch auf den Abschnitt TARGET klicken) und dann auf die Schaltfläche unten - mittel "Validate Settings" genannt.

XCode selbst validierte die Projektdateien und sagte mir, dass das Problem eine doppelte Zieldefinition war, und bot an, es zu beheben ... und voilá, das Problem ist weg!

Viel Glück!

0
Oscar Salguero

Ich hatte dieses Problem persönlich, als ich einen static library entwickelte. Ich hatte das static library-Ziel mit dem gesamten Produktionscode und ein Testziel, das die MyStaticLib.a-Datei als Framework einzeichnete.

Tests liefen gut in Xcode, aber nicht im Terminal mit xcodebuild. Das Problem bestand schließlich darin, dass das static library-Ziel für Standard architectures kompiliert wurde, während das Testziel für Standard architectures (including 64-bit) kompilieren wollte. Das Ändern des Testziels auf Standard architectures hat alles behoben.

0
marklar