Il s'agit d'une erreur d'exécution causée par Dynamic Linker
dyld: Library not loaded: @rpath/...
...
Reason: image not found
L'erreur Library not loaded
avec @rpath
indique que Dynamic Linker
le binaire est introuvable.
Vérifiez si le cadre dynamique a été ajouté à General -> Embedded Binaries
Vérifiez la @rpath
configuration entre le consommateur (application) et le producteur (cadre dynamique):
- Cadre dynamique:
Build Settings -> Dynamic Library Install Name
- Application:
Build Settings -> Runpath Search Paths
Build Phases -> Embed Frameworks -> Destination, Subpath
Éditeur de liens dynamique
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
qui est utilisé par loadable bundle
( Dynamic framework
comme dérivé) où dyld
entrent en jeu
Dynamic Library Install Name
- chemin vers le fichier binaire (pas .framework). Oui, ils ont le même nom, mais MyFramework.framework
est un packaged bundle
avec MyFramework
fichier binaire et des ressources à l' intérieur.
Ce chemin vers le répertoire peut être absolu ou relatif (par exemple @executable_path
, @loader_path
, @rpath
). Le chemin relatif est plus préférable car il est modifié avec une ancre qui est utile lorsque vous distribuez votre bundle en tant que répertoire unique
chemin absolu - exemple Framework1
//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1
@executable_path
@executable_path - relatif à l'entrée binaire - Exemple d'
utilisation de Framework2
: incorporer un Dynamic framework
dans une application
//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 - par rapport au bundle propriétaire de ce
cas d'utilisation binaire : framework avec framework embarqué - Framework3_1 avec Framework3_2 à l' intérieur
//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 - Chemin de recherche Runpath
Exemple de Framework2
Auparavant, nous devions configurer un Framework pour travailler avec dyld. Ce n'est pas pratique car le même Framework ne peut pas être utilisé avec des configurations différentes
@rpath
est un concept composé qui repose sur des parties externes (Application) et imbriquées (Dynamic framework):
Application:
Cadre dynamique:
//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
*../
- aller au parent du répertoire courant
otool
- outil d'affichage de fichier objet
//-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
modifier les noms d'installation des bibliothèques partagées dynamiques à l'aide de -rpath
CocoaPods
utilise use_frameworks!
[About] pour réguler unDynamic Linker
[Vocabulaire]
Link Binary with Libraries
et Xcode sait en quelque sorte les copier dans votre bundle d'application, alors que pour les cadres personnalisés, cela ne se produit tout simplement pas.