wake-up-neo.com

Wie kann ich XCode 4-Arbeitsbereiche so konfigurieren, dass sie bei Bedarf Abhängigkeiten aufbauen?

Mein Fall ist einfach: ein Arbeitsbereich mit zwei gleichgeordneten Projekten: eine Hauptanwendung (iOS) und ein Projekt, das mehrere statische Bibliotheksziele erstellt, die von der App verwendet werden.

So habe ich den Build konfiguriert:

  • wies einen 'Suchpfad für Benutzerheader' in den Build-Einstellungen der Hauptanwendung auf den Speicherort des Bibliotheksprojekts aus (über einen Quellbaum)
  • im Editor des Hauptziels meiner App -> Bauphasen -> Abschnitt "Verknüpfung von Binärdateien mit Bibliotheken" wurden die Bibliotheksprodukte hinzugefügt, die ich verwenden möchte.
  • im Schema wurde das Kontrollkästchen "Implizite Abhängigkeiten suchen" aktiviert.

Nach einer Bereinigung (und dem Löschen der abgeleiteten Daten) kann ein Fehler beim Erstellen des Hauptprojekts durch diesen Fehler behoben werden:

ld: library not found for -lChipmunk
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang failed with exit code 1

Wenn ich mir die neu erstellten abgeleiteten Daten ansehe, werden nur die Objektdateien gefunden, die für die Hauptanwendung gefunden werden, nicht für die Bibliotheken. Ein weit verbreitetes "find" für * .o-Dateien enthüllt keine relevanten Informationen. Die Bibliotheken gehen also nicht verloren, sie werden definitiv nicht erstellt.

Einige ergänzende Punkte: 

  • wenn ich in den Apple-Entwicklerforen danach gefragt habe, wurde vorgeschlagen, dass ich explizite Deps im Build Phases-> Target Dependencies-Editor des Hauptziels hinzufügen sollte. Sie können hier jedoch nur Deps zu Zielen im same - Projekt oder in Unterprojekten hinzufügen. In meinem Fall habe ich die App- und Bibliotheksprojekte als Geschwister am Arbeitsplatz.
  • wenn ich jede Bibliothek vor dem Hauptaufbau manuell baue, ist alles in Ordnung.

Aktualisieren:

Ich habe gerade eine Problemumgehung herausgefunden, die darin besteht, alle Ziele der Deps in den Build-Teil des Hauptschemas der App aufzunehmen. Ich hatte dies zuvor ohne Erfolg versucht, aber ich hatte nicht gemerkt, dass ich die Ziele in der Liste verschieben konnte, um die richtige Build-Reihenfolge zu erhalten. Builds finden jetzt in der richtigen Reihenfolge statt, sowohl nach einer Bereinigung als auch nach Änderungen in der Bibliothek oder in der Haupt-App-Quelle.

Ich lasse die Frage hier, denn ein manuelles Sortieren einer Build-Reihenfolge sollte sicherlich nicht notwendig sein. Es muss etwas falsch sein, wie ich die Dinge eingerichtet habe.

36
Cris

Das Bearbeiten des Schemas (Austausch von Build-Zielen, Deaktivieren von "Parallelize Build" und/oder "Implizite Abhängigkeiten suchen") hat bei mir nicht funktioniert. Ich musste immer noch das Projekt nach jeder Codeänderung in der statischen Bibliothek bereinigen. Beim Durchsuchen der Dev-Foren fand ich schließlich diese Antwort , was Wunder wirkte. 

Stellen Sie sicher, dass der Identitäts- und Typinspektor angezeigt wird, und wählen Sie die Datei libWhatever.a im Projekt Ihrer Anwendung aus (nicht die Bibliothek). Wenn Sie Standort: relativ zu Projekt [oder relativ zu Gruppe] sehen, ist dies Ihr Problem.

  1. Klicken Sie auf relativ zu Projekt und ändern Sie es in relativ zu Build Produkte.
  2. Dadurch wird der Typ des Links geändert, es wird jedoch weiterhin erledigt sein.
  3. Klicken Sie auf die Suchschaltfläche und suchen Sie die Ausgabedatei.

Durch Hinzufügen einer statischen Bibliothek zu einem vorhandenen Projekt über Build Phases -> Link Binary with Libraries wird diese automatisch "relativ zu einer Gruppe" (wenn sich beide im gleichen Arbeitsbereich befinden). Wenn Sie die Position wie oben beschrieben ändern, wird das Build-Abhängigkeitsproblem behoben. Ihre .a-Datei sollte im Projektnavigator in schwarzen Buchstaben (statt in rot) angezeigt werden.

41
christoph

Ich habe hier beschrieben, wie ich mehrere Projekte in einem Arbeitsbereich eingerichtet habe: http://blog.carbonfive.com/2011/04/04/ using-open-source-static-libraries-in-xcode-4/

Ich stimme zu, dass das manuelle Anpassen der Build-Zielreihenfolge im Schema auf der Grundlage der Dokumentation von Xcode nicht erforderlich sein sollte. Dies ist jedoch die beste Lösung, die ich bisher gefunden habe.


Bearbeiten: Wann immer möglich empfehle ich die Verwendung von https://github.com/CocoaPods/CocoaPods , um die Projektabhängigkeiten an dieser Stelle zu verwalten.

8
Jonah

Versuchen Sie, das Bibliotheksprojekt in das Hauptprojekt zu ziehen:

library project reference inside main project

2
Jeffy

In meinem Fall kann ich diese Geschwister-Konfigurations-Build nur durch das manuelle Hinzufügen des Pfads "../MyLibProject/build/Debug-iphoneos" (Überprüfung rekursiv, nur um sicherzustellen, dass dies der Fall ist) in meinen Build-Einstellungen -> Bibliothek-Suchpfade hinzufügen. Das Hinzufügen der .a-Datei im Main-Projekt allein hat den Fehler "lib not found" zum Zeitpunkt der Verknüpfung nicht verhindert.

0
Ben G