webentwicklung-frage-antwort-db.com.de

Wie soll ich Abhängigkeiten projektübergreifend in einem Xcode-Arbeitsbereich verwalten?

Ich arbeite an einem iOS-App-Projekt und füge das JSON-Framework-Projekt zum Arbeitsbereich hinzu. Der Projektnavigator auf der linken Seite zeigt beide Projekte an, und der Build-Schema-Selektor zeigt auch die Schemata beider Projekte an. Jetzt möchte ich das libjson.a-Ziel aus dem json-framework-Projekt als Abhängigkeit vom iOS-App-Ziel im anderen Projekt hinzufügen. Das erwartete Ergebnis ist, dass jedes Mal, wenn das App-Ziel erstellt wird, es (falls erforderlich) das Bibliotheksziel erstellt und das App-Ziel damit verknüpft. Ich habe Folgendes versucht:

  • Erstellen Sie beide als Teil desselben Schemas. Ich versuche dies, indem ich das Schema für meine App bearbeite, 'libjson.a' zum 'Build'-Teil des Schemas hinzufüge und übrigens "Implizite Abhängigkeiten suchen" prüfe. Dann gehe ich zum Zieleditor für mein App-Ziel und wähle unter "Phasen erstellen" -> "Binär mit Bibliotheken verknüpfen" 'libjson.a' aus der Liste der Arbeitsbereichsbibliotheken aus. Wenn ich anschließend versuche, das Schema zu erstellen, wird das Bibliotheksziel erstellt, aber das Erstellen des App-Ziels schlägt mit dem Linker-Fehler "Bibliothek nicht für -ljson gefunden" fehl - was darauf hindeutet, dass die Bibliothek nicht tatsächlich erstellt wurde. Tatsächlich ist im Projektnavigator der Eintrag unter dem App-Projekt für die Bibliothek immer noch rot, was darauf hinweist, dass die Datei nicht vorhanden ist.

  • Fügen Sie das json-Ziel als explizite Abhängigkeit hinzu. Um dies zu versuchen, ändere ich das Erstellungsschema nicht, gehe aber zum Zieleditor für mein App-Ziel und klicke auf die Schaltfläche Hinzufügen unter "Zielabhängigkeiten". Es werden keine Ziele aus anderen Projekten im Arbeitsbereich angezeigt. Dies ist also kein Starter.

  • Ziehen Sie das JSON-Projekt in das andere Projekt und fügen Sie das Ziel als Abhängigkeit hinzu. Das hätte ich in Xcode 3 gemacht. Im Projektnavigator greife ich nach dem Bibliotheksprojekt und ziehe es über das App-Projekt. Daraufhin wird der übliche Bereich "Dateien hinzufügen" angezeigt, den ich nur durch Klicken auf "Fertig stellen" beende. Es gibt jetzt zwei Einträge für das Bibliotheksprojekt im Projektnavigator: einen auf der obersten Ebene und einen unter dem App-Projekt. Ich kann das Bibliotheksziel jetzt mit dem Ziel-Editor als Abhängigkeit des App-Ziels hinzufügen und in der Verbindungsbibliotheksphase fehlerfrei mit ihm verknüpfen. Aber es sieht kaputt aus: Es gibt mehrere Einträge für dasselbe Projekt im Navigator. Gibt es einen anderen Weg, dies zu tun?

Was ist als "Xcode 4-ish" -Methode zu betrachten, um diese Ziele in verschiedenen Projekten im selben Arbeitsbereich zu verbinden? Es scheint zu fehlen, wenn mehrere Projekte im selben Arbeitsbereich nicht miteinander interagieren können. Danke, Graham.

59
user23743

Ich habe gerade ein Testprojekt eingerichtet, so wie Sie es in Version 3 beschrieben haben, indem ich einen neuen Arbeitsbereich erstellt und die beiden Xcode-Projekte verschachtelt in diesen gezogen habe (siehe Abbildung).

Sie können das Geschwisterprojekt löschen, wenn Sie es bereits haben.

Wenn Sie darauf aufbauen, funktioniert es, soweit ich sehen kann.

Scheme SettingsProject Layout

Ich stelle mir vor, dass bei zwei Projekten eine interne Pfadverwirrung besteht und ich neige dazu, mit den Standorteinstellungen unter "Ansicht" -> "Dienstprogramme" -> "Dateiinspektor" zu experimentieren und zu prüfen, welche Auswirkungen dies hat.

enter image description hereenter image description here

Sie können auch versuchen, Ihre Pfade in Xcode "Einstellungen ..." -> "Quellbäume" einzurichten und auf diese Weise zu verweisen, wie hier beschrieben: Einfache, modulare Codefreigabe über iPhone-Apps: Statische Bibliotheken und Cross -Projektreferenzen

HTH. Andy W.

24
creednmd

Es ist mir gelungen, Abhängigkeiten zwischen Projekten in einem Arbeitsbereich wie hier beschrieben zum Funktionieren zu bringen: http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode -4 / .

Leider kann ich Xcode nicht dazu bringen, implizite Abhängigkeiten zu erkennen oder alles im Build wie angegeben zu indizieren. Ich habe eine Umgehung für beide gefunden, aber ich hoffe, dass weniger manuelle Konfiguration erforderlich ist, wenn Xcode 4 ausgereift ist.

9
Jonah

Ich wollte die gleiche Frage stellen und dachte, dass meine eigene Lösung nicht richtig sein könnte. Aber ich sehe es hier nicht erwähnt, und es scheint zu funktionieren. Offensichtlich ist XCode 4 noch in Arbeit. :)

Ich habe einen Arbeitsbereich mit zwei Projekten: eine statische Bibliothek und eine App, die die Bibliothek verwendet. Die Projekte sind Geschwister. Jedes Projekt hat ein eigenes Schema, und jedes Schema ist so festgelegt, dass nur ein Ziel erstellt wird. Mit anderen Worten, ich habe dem Arbeitsbereich zwei Projekte hinzugefügt und das wars.

Um die statische Bibliothek als Abhängigkeit von der App hinzuzufügen, ziehe ich einfach das Produkt libsomething.a aus dem Bibliotheksprojekt (Project Navigator) in die Liste "Binär mit Bibliotheken verknüpfen" für das App-Ziel. Das ist es. Wenn ich jetzt die App erstelle, wird das Bibliotheksprojekt zuerst erstellt und dann verknüpft. Interessanterweise wird die Bibliothek mit derselben Konfiguration erstellt, wenn ich das Schema der App so ändere, dass eine andere Konfiguration verwendet wird (z. B. Release anstelle von Debug).

So funktioniert es, und hier läuft eindeutig eine automatische Abhängigkeitsprüfung. Aber es fühlt sich falsch an. Andererseits auch der modale Schema-Editor/Manager und das Fehlen eines Arbeitsbereichsobjekts im Projektnavigator ... Ich hätte nie gedacht, dass ich es sagen würde, aber die Visual Studio-Benutzeroberfläche (bleh) ist viel klarer.

1
Tyler Daniel

Meine kugelsichere Lösung dafür:

Erstellen Sie "Pro Debug-Release/Pro Architektur" -Einstellungen in den Build-Einstellungen im Hauptprojekt (nicht in der Bibliothek), um entweder ../MyLibProject/build/Debug-iphoneos oder ../MyLibProject/build/Release-iphonesimulator oder usw. einzuschließen ..
abhängig von der Konfiguration (Sie können diese Art von Konfiguration erstellen, indem Sie auf das + neben Debug oder Release klicken und entweder "Beliebiges iOS-Simulator-SDK" oder "Beliebiges iOS-SDK" auswählen. Sie müssen dies für beide tun "Header Search Path" (für den Fall, dass Ihre Bibliothek einige Header-Dateien kopiert, was mehr als wahrscheinlich ist) UND für "Library Search Paths" (Bibliothekssuchpfade). Dies bedeutet, dass Sie für jede Einstellung wahrscheinlich 4 verschiedene Pfade haben (Debug-Sim) , debuggen Sie ios, geben Sie sim frei, geben Sie ios frei.) Das würde sicherstellen, dass die Konfiguration beider Projekte zusammenpasst.

Um nun die Bibliothek automatisch zu kompilieren, dh die Abhängigkeit zu erstellen, können Sie den oben angegebenen Hinweis "Erstellungsphase -> Verknüpfung mit Binärdateien -> + -> Datei auswählen" verwenden.

Nur so ist es mir gelungen, für jede Umgebung auf xcode 4.5 etwas zu erstellen und richtig zu verknüpfen

Hinweis: Ich habe sogar das -lmyLib-Flag unter "Andere Linker-Flags" hinzugefügt, bin mir aber nicht sicher, ob das wirklich notwendig ist

1
Ben G

Xcode Workspace

Ein workspace ist ein Xcode-Dokument, das Projekte und andere Dokumente gruppiert, sodass Sie sie gemeinsam bearbeiten können. Ein Arbeitsbereich kann eine beliebige Anzahl von Xcode-Projekten sowie andere Dateien enthalten, die Sie einbeziehen möchten. Ein Arbeitsbereich organisiert nicht nur alle Dateien in jedem Xcode-Projekt, sondern bietet auch implizite und explizite Beziehungen zwischen den enthaltenen Projekten und ihren Zielen.

Arbeitsbereiche erweitern den Umfang Ihres Workflows

Eine Projektdatei enthält Zeiger auf alle Dateien im Projekt sowie Erstellungskonfigurationen und andere Projektinformationen. In Xcode 3 und früheren Versionen ist die Projektdatei immer der Stamm der Gruppen- und Dateistrukturhierarchie. Obwohl ein Projekt Verweise auf andere Projekte enthalten kann, ist die Arbeit an zusammenhängenden Projekten in Xcode 3 kompliziert. Die meisten Workflows beschränken sich auf ein einziges Projekt. In Xcode 4 und höher haben Sie die Möglichkeit, einen Arbeitsbereich für ein oder mehrere Projekte sowie alle anderen Dateien zu erstellen, die Sie einbeziehen möchten.

Projekte in einem Arbeitsbereich geben ein Erstellungsverzeichnis frei

Standardmäßig werden alle Xcode-Projekte in einem Arbeitsbereich in demselben Verzeichnis erstellt, das als Arbeitsbereich-Erstellungsverzeichnis bezeichnet wird. Jeder Arbeitsbereich verfügt über ein eigenes Erstellungsverzeichnis. Da sich alle Dateien in allen Projekten in einem Arbeitsbereich im selben Erstellungsverzeichnis befinden, sind alle diese Dateien für jedes Projekt sichtbar. Wenn zwei oder mehr Projekte dieselbe Bibliothek verwenden, müssen Sie sie nicht separat in jeden Projektordner kopieren.

Xcode untersucht die Dateien im Erstellungsverzeichnis auf implizite Abhängigkeiten. Wenn beispielsweise ein in einem Arbeitsbereich enthaltenes Projekt eine Bibliothek erstellt, mit der ein anderes Projekt im selben Arbeitsbereich verknüpft ist, erstellt Xcode die Bibliothek automatisch, bevor das andere Projekt erstellt wird, auch wenn die Erstellungskonfiguration diese Abhängigkeit nicht explizit macht. Sie können solche impliziten Abhängigkeiten bei Bedarf mit expliziten Build-Einstellungen überschreiben. Für explizite Abhängigkeiten müssen Sie Projektreferenzen erstellen.

Jedes Projekt in einem Arbeitsbereich hat weiterhin eine eigene, unabhängige Identität. Um an einem Projekt zu arbeiten, ohne die anderen Projekte im Arbeitsbereich zu beeinträchtigen oder von ihnen betroffen zu sein, können Sie das Projekt öffnen, ohne den Arbeitsbereich zu öffnen, oder Sie können das Projekt einem anderen Arbeitsbereich hinzufügen. Da ein Projekt zu mehr als einem Arbeitsbereich gehören kann, können Sie Ihre Projekte in beliebig vielen Kombinationen bearbeiten, ohne eines der Projekte oder Arbeitsbereiche neu konfigurieren zu müssen.

In XCode 4 soll die Idee von Arbeitsbereichen die Funktionalität von XCode 3s cross-project references[Über] Lesen Sie mehr hier

0
yoAlex5

Ich hatte einige Erfolge beim Erstellen von Framework-ähnlichen statischen Bibliotheken , obwohl dies keine perfekte Lösung ist.

0
amrox