Kann ich ein Framework in ein anderes Framework einfügen?

8

Ich schreibe ein Framework (genannt Lighthouse.framework), das wiederum Code aus einem anderen Framework (RegexKit.framework, um genau zu sein) verwendet. Ich habe RegexKit.framework in mein eigenes Framework kopiert, so dass es eine Struktur wie folgt hat:

%Vor%

Wenn ich jedoch versuche, eine Anwendung auszuführen, die Lighthouse.framework (mein Framework) verwendet, erhalte ich den folgenden Fehler:

  

dyld: Bibliothek nicht geladen: @executable_path /../ Frameworks / RegexKit.framework / Versions / A / RegexKit

     

Referenziert von: /Users/mdippery/Developer/Projects/Current/lighthouse/build/Debug/Lighthouse.framework/Versions/A/Lighthouse

     

Grund: Bild nicht gefunden

Offensichtlich findet der Lader RegexKit nicht.

Hier sind die Pfade, die der Lader laden soll, mit freundlicher Genehmigung von otool :

%Vor%

Kann ich ein Framework in ein anderes Framework aufnehmen? Ist das der richtige Weg? Wie kann ich meinen Fehler beheben?

    
mipadi 18.08.2010, 20:26
quelle

3 Antworten

1

Ich habe eine Lösung für dieses Problem gefunden. Ich habe ein paar Ideen aus sbooths Antwort übernommen, aber die Lösung war einfacher. Ich habe dieses Skript ausgeführt:

%Vor%

als Run Build Script-Phase.

Beachten Sie, dass Sie für den allgemeinen Fall @executable_path/../ in @loader_path/ ändern müssen, und alles ist gut.

    
mipadi 20.08.2010, 12:53
quelle
8

Am einfachsten ist es, @rpath zu verwenden. Ihre Konfiguration sollte wie folgt aussehen:

  1. Setzen Sie das Installationsverzeichnis von RegExKit.framework auf @rpath
  2. Legen Sie das Installationsverzeichnis von Lighthouse.frameworks auf @rpath
  3. fest
  4. Legen Sie die Pfadpfade-Suchpfade von Lighthouse.framework auf @ loader_path / Frameworks
  5. fest
  6. Stellen Sie sicher, dass RegExKit.framework in den Framework-Unterordner von Lighthouse.framework kopiert wird (verwenden Sie hierfür eine benutzerdefinierte Erstellungsphase)

Schließlich sollten alle Anwendungen, die mit Lighthouse.framework verknüpft sind, Runpath-Suchpfade auf @loader_path /../ Frameworks

setzen     
sbooth 19.08.2010 00:54
quelle
1

Ja, können Sie.

Sie benötigen jedoch das enthaltene Framework, um zu wissen, was sein installierter Ort zum Zeitpunkt der Erstellung ist; Andernfalls wird dyld nicht in der Lage sein, es zur Laufzeit zu finden, wie Sie gesehen haben.

Die relevanten Einstellungen in XCode, wenn ich mich richtig erinnere, sind "Installation Directory" und "Framework Install Name". Letzteres wird wahrscheinlich nicht für Ihre Verwendung von Bedeutung sein, aber Sie werden erstere als etwas in der Art von @executable_path/../Frameworks/Lighthouse.framework/Versions/A/Frameworks/RegexKit.framework/Versions/A/

benötigen     
Stephen Canon 18.08.2010 20:34
quelle