Es ist ein Laufzeitfehler, der durch verursacht wird Dynamic Linker
dyld: Library not loaded: @rpath/...
...
Reason: image not found
Der Fehler Library not loaded
mit @rpath
zeigt an, dass Dynamic Linker
die Binärdatei nicht gefunden werden kann.
Überprüfen Sie, ob das dynamische Framework hinzugefügt wurde General -> Embedded Binaries
Überprüfen Sie das @rpath
Setup zwischen Consumer (Anwendung) und Producer (Dynamic Framework):
- Dynamisches Framework:
Build Settings -> Dynamic Library Install Name
- Anwendung:
Build Settings -> Runpath Search Paths
Build Phases -> Embed Frameworks -> Destination, Subpath
Dynamischer Linker
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
Dies wird von loadable bundle
( Dynamic framework
als Ableitung) verwendet, wo dyld
ins Spiel kommt
Dynamic Library Install Name
- Pfad zur Binärdatei (nicht .framework). Ja, sie haben die gleichen Namen, aber MyFramework.framework
ein packaged bundle
mit MyFramework
Binär - Datei und Ressourcen im Innern.
Dieser Pfad zum Verzeichnis kann absolut oder relativ sein (zB @executable_path
, @loader_path
, @rpath
). Der relative Pfad ist vorzuziehen, da er zusammen mit einem Anker geändert wird, der nützlich ist, wenn Sie Ihr Bundle als einzelnes Verzeichnis verteilen
absoluter Pfad - Framework1 Beispiel
//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1
@executable_path
@executable_path - relativ zum Eintrag binär - Framework2- Beispielanwendungsfall
: Einbetten eines Dynamic framework
in eine Anwendung
//Application bundle(`.app` package) absolute path
/some_path/Application.аpp
//Application binary absolute path
/some_path/Application.аpp/subfolder1
//Framework2 binary absolute path
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1
//Framework2 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1
//Framework2 Dynamic Library Install Name
@executable_path/../Frameworks/Framework2.framework/subfolder1
//Framework2 binary resolved absolute path by dyld
/some_path/Application.аpp/subfolder1/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1
@loader_path
@loader_path - relativ zum Bundle, das Eigentümer dieses binären
Anwendungsfalls ist: Framework mit eingebettetem Framework - Framework3_1 mit Framework3_2 im Inneren
//Framework3_1 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1
//Framework3_2 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1
//Framework3_1 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1
//Framework3_1 @loader_path == Framework3_1 @executable_path
/some_path/Application.аpp/subfolder1
//Framework3_2 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1
//Framework3_2 @loader_path == Framework3_1 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1
//Framework3_2 Dynamic Library Install Name
@loader_path/../Frameworks/Framework3_2.framework/subfolder1
//Framework3_2 binary resolved absolute path by dyld
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1/../Frameworks/Framework3_2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1
@rpath - Runpath-Suchpfad
Framework2 Beispiel
Zuvor mussten wir ein Framework einrichten, um mit dyld zu arbeiten. Dies ist nicht praktisch, da dasselbe Framework nicht mit unterschiedlichen Konfigurationen verwendet werden kann
@rpath
ist ein zusammengesetztes Konzept, das auf äußeren (Anwendung) und verschachtelten (Dynamic Framework) Teilen basiert:
Anwendung:
Dynamisches Framework:
//Application Runpath Search Paths
@executable_path/../Frameworks
//Framework2 Dynamic Library Install Name
@rpath/Framework2.framework/subfolder1
//Framework2 binary resolved absolute path by dyld
//Framework2 @rpath is replaced by each element of Application Runpath Search Paths
@executable_path/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1
* ../
- Wechseln Sie zum übergeordneten Verzeichnis des aktuellen Verzeichnisses
otool
- Werkzeug zur Anzeige von Objektdateien
//-L print shared libraries used
//Application otool -L
@rpath/Framework2.framework/subfolder1/Framework2
//Framework2 otool -L
@rpath/Framework2.framework/subfolder1/Framework2
//-l print the load commands
//Application otool -l
LC_LOAD_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2
LC_RPATH
@executable_path/../Frameworks
//Framework2 otool -l
LC_ID_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2
install_name_tool
Ändern Sie die Installationsnamen der dynamischen gemeinsam genutzten Bibliothek mithilfe von -rpath
CocoaPods
verwendet use_frameworks!
[About] , um a zu regulierenDynamic Linker
[Wortschatz]
Link Binary with Libraries
in Ihr App-Bundle kopiert werden können, während dies bei benutzerdefinierten Frameworks einfach nicht der Fall ist.