Jest to błąd czasu wykonywania spowodowany przez Dynamic Linker
dyld: Library not loaded: @rpath/...
...
Reason: image not found
Błąd Library not loaded
z @rpath
wskazuje, że Dynamic Linker
nie można znaleźć pliku binarnego.
Sprawdź, czy dodano ramy dynamiczne General -> Embedded Binaries
Sprawdź @rpath
konfigurację między konsumentem (aplikacją) a producentem (dynamiczne środowisko):
- Dynamiczne ramy:
Build Settings -> Dynamic Library Install Name
- Podanie:
Build Settings -> Runpath Search Paths
Build Phases -> Embed Frameworks -> Destination, Subpath
Dynamiczny linker
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
który jest używany przez loadable bundle
( Dynamic framework
jako pochodną), gdzie dyld
wchodzi w grę
Dynamic Library Install Name
- ścieżka do pliku binarnego (nie .framework). Tak, mają taką samą nazwę, ale MyFramework.framework
jest packaged bundle
zMyFramework
pliku binarnego i zasobów wewnątrz.
Ta ścieżka katalogu mogą być bezwzględne lub względne (np @executable_path
, @loader_path
, @rpath
). Ścieżka względna jest bardziej preferowana, ponieważ jest zmieniana wraz z kotwicą, która jest przydatna, gdy dystrybuujesz swój pakiet jako pojedynczy katalog
ścieżka absolutna - przykład Framework1
//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1
@executable_path
@executable_path - względem wejścia binarnego - Framework2 Przykład
użycia : osadzenie a Dynamic framework
w aplikacji
//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 - w stosunku do pakietu, który jest właścicielem tego binarnego
przypadku użycia: framework z osadzonym frameworkiem - Framework3_1 z Framework3_2 wewnątrz
//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 - Ścieżka wyszukiwania Runpath
Framework2Przykład
Wcześniej musieliśmy skonfigurować Framework do pracy z dyld. Nie jest to wygodne, ponieważ ten sam Framework nie może być używany z różnymi konfiguracjami
@rpath
jest złożoną koncepcją opartą na częściach zewnętrznych (Aplikacja) i zagnieżdżonych (Dynamiczne środowisko):
Podanie:
Dynamic 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
*../
- przejdź do rodzica bieżącego katalogu
otool
- narzędzie do wyświetlania plików obiektowych
//-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
zmień nazwy instalacji dynamicznej biblioteki współużytkowanej za pomocą -rpath
CocoaPods
używa use_frameworks!
[Informacje] do regulowaniaDynamic Linker
[Słownictwo]
Link Binary with Libraries
a Xcode wie, jak je skopiować do pakietu aplikacji, podczas gdy w przypadku niestandardowych ram po prostu tak się nie dzieje.