Frage

Ich habe ein benutzerdefiniertes Framework, das den Ratschlägen im Framework Programming Guide von Apple folgt >> Installieren Ihres Frameworks Ich installiere in /Library/Frameworks.Dazu füge ich eine Build-Phase „Skript ausführen“ mit dem folgenden Skript hinzu:

cp -R  build/Debug/MyFramework.framework /Library/Frameworks

In meinen Projekten verlinke ich dann gegen /Library/Frameworks/MyFramework und importiere es wie folgt in meine Klassen:

#import <MyFramework/MyFramework.h>

Das funktioniert sehr gut, außer dass ich in meiner Debugger-Konsole immer die folgende Meldung sehe:

Programm wird in den Debugger geladen... sharedlibrary apply-load-rules alle Warnung:Symbole für „/Users/elisevanlooij/Library/Frameworks/MyFramework.framework/Versions/A/MyFramework“ können nicht gelesen werden (Datei nicht gefunden).Warnung:Symbole aus „MyFramework“ können nicht gelesen werden (noch nicht im Speicher zugeordnet).Programm geladen.

Anscheinend sucht der Compiler zuerst in /Users/elisevanlooij/Library/Frameworks, kann MyFramework nicht finden, sucht dann in /Library/Frameworks, findet MyFramework und setzt seinen fröhlichen Weg fort.Bisher war dies eher ein Ärgernis als ein echtes Problem, aber beim Ausführen von Unit-Tests stoppt gdb bei (Datei nicht gefunden) und weigert sich, fortzufahren.Ich habe das Problem gelöst, indem ich der Phase „Skript ausführen“ eine zusätzliche Zeile hinzugefügt habe

cp -R  build/Debug/MyFramework.framework ~/Library/Frameworks

Aber es fühlt sich an, als würde man etwas aufkleben, das gar nicht erst kaputt gehen sollte.Wie kann ich das beheben?

War es hilfreich?

Lösung

In den letzten Monaten habe ich viel mehr über Frameworks gelernt, so dass ich Umschreiben diese Antwort. Bitte beachten Sie, dass ich rede einen Rahmen als Teil der Entwicklung Workflow-Installation .

Die bevorzugte Lage für einen öffentlichen Rahmen der Installation (dh einen Rahmen, der von mehr als einer Ihrer Apps oder Bündel verwendet wird) ist / Library / Frameworks [link text], weil „Frameworks in diesem Ort werden automatisch vom Compiler entdeckt bei der Kompilierung und den dynamischen Linker zur Laufzeit. "[Framework-Programmierhandbuch]. Der eleganteste Weg, dies zu tun, ist im Abschnitt Bereitstellung der Build-Einstellungen.

Wie Sie auf Ihrem Rahmen arbeiten, gibt es Zeiten, wenn Sie den Rahmen aktualisieren möchten, wenn Sie einen Build zu tun, und Zeiten, wenn Sie dies nicht tun. Aus diesem Grunde ändere ich die Deployment-Einstellungen nur in der Release-Konfiguration. Also:

  1. Doppelklicken Sie auf den Rahmen Ziel des Ziel Info-Fenster aufzurufen, und wechseln Sie auf die Registerkarte Erstellen.
  2. Wählen Sie Freigabe in der Konfiguration selectbox.
  3. Blättern Sie zu dem Abschnitt Bereitstellung von nach unten und geben Sie die folgenden Werte:
  

Deployment Location = YES (Klicken Sie auf das Kontrollkästchen)

     

Installation beim Aufbau Produkte Location = /

     

Installationsverzeichnis = / Library / Frameworks

Der Installations Build-Produkte Standort dient als Wurzel der Anlage. Der Standardwert ist einige Verzeichnis / tmp., Wenn Sie es an das System Wurzel nicht ändern, werden Sie nie Ihr installiertes Rahmen sehen, da es versteckt ist im Verzeichnis / tmp

Jetzt können Sie auf Ihrem Rahmen arbeiten, wie Sie in der Debug-Konfiguration wie ohne Ihre anderen Projekte zu stören, und wenn Sie bereit sind, alles, was Sie tun müssen, veröffentlichen, ist Schalter auf Release und Build-tun.

Xcode 4 Warnung Da die Umstellung auf Xcode 4 habe ich eine Reihe von Problemen mit meinem benutzerdefinierten Rahmen erlebt. Meistens verknüpfen sie Warnungen in GDB, die nicht wirklich mit der Nützlichkeit des Rahmens eingreifen, außer wenn die Einbaugerät-Test ausgeführt wird. Ich habe vor einer Woche ein technisches Support-Ticket an Apple eingereicht, und sie sind noch auf der Suche hinein. Wenn ich eine funktionierende Lösung erhalten werde ich diese Antwort aktualisieren, da die Frage sehr beliebt erwiesen hat (1 kViews und Zählen).

Andere Tipps

Es gibt nicht viel Grund zur Schaffung eines Rahmens in Library / Frameworks zu setzen, und es ist eine Menge Arbeit: Sie müssten entweder es für den Benutzer in einem Installer-Paket zu tun, die eine enorme Aufwand zu schaffen und zu erhalten, oder habe Installationscode in Ihrer Anwendung (die nur zu ~ / L / F, wenn Sie die Zeit und Mühe aufwenden installieren könnte notwendig, um Ihre Anwendung installieren zu / L / F mit root-Kräften fähig zu machen).

Viel häufiger ist was Apple nennt ‚private Rahmen‘ . Sie finden diese in Ihrem Anwendungspaket bündeln.

Auch Rahmenbedingungen für die allgemeine Nutzung durch alle Anwendungen (zB Sparkle, Growl), gebaut in der Praxis als privates Frameworks verwendet werden, nur weil der „richtige“ Weg, um eine einzelne Kopie der Rahmens Bibliothek der Installation / Frameworks ist ein solcher Aufwand.

Der herkömmliche Weg, dies zu tun, ist Ihr Framework Projekt haben und ihren Kunden teilen sich ein gemeinsames Build-Verzeichnis. Xcode wird für Rahmen Kopf- und Link gegen Framework-Binärdateien in den Build-Ordner zuerst , vor jedem anderen Ort suchen. So ein App-Projekt, das kompiliert und Links gegen den Header der abholen meist erst kürzlich errichtete man, anstatt alles, was installiert ist.

Sie können dann den cp -r entfernen und stattdessen den Standort Build installieren verwenden Einstellung Build Produkte in dem endgültigen Standort zu platzieren, mit DSTROOT = / in der Befehlszeile xcodebuild installieren. Aber Sie werden nur dies tun müssen, wenn Sie fertig sind, nicht jedes Mal, wenn Sie den Rahmen wieder aufzubauen.

Wenn Sie Ihr Framework verteilen, sollte es natürlich in /Library/Frameworks installiert werden;Allerdings kommt es mir seltsam vor, dass Sie das mit den Test-/Debug-Versionen Ihres Frameworks tun.

Mein erster Instinkt wäre, Testversionen unter ~/Library zu installieren, da dies die Einrichtung Ihrer Test- und Debug-Umgebung viel einfacher macht.Wenn möglich, würde ich erwarten, dass sich das Debug-/Test-Framework im Build-Baum der Version befindet, die ich teste. In diesem Fall wird es als installiert Privates Framework zu Testzwecken.Das würde Ihr Leben viel einfacher machen, wenn Sie mit mehreren Versionen Ihres Frameworks arbeiten müssen.

Letztlich spielt es keine Rolle, wo sich das Framework befindet, solange Ihre Anwendung oder Testsuite die richtige Version lädt.Wählen Sie den Speicherort, der das Testen/Debuggen/Entwicklung am einfachsten macht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top