Es un error de tiempo de ejecución causado por Dynamic Linker
dyld: Library not loaded: @rpath/...
...
Reason: image not found
El error Library not loaded
con @rpath
indica que Dynamic Linker
no se puede encontrar el binario.
Compruebe si se agregó el marco dinámico a General -> Embedded Binaries
Compruebe la @rpath
configuración entre consumidor (aplicación) y productor (marco dinámico):
- Marco dinámico:
Build Settings -> Dynamic Library Install Name
- Solicitud:
Build Settings -> Runpath Search Paths
Build Phases -> Embed Frameworks -> Destination, Subpath
Enlazador dinámico
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
que es utilizado por loadable bundle
( Dynamic framework
como derivado) donde dyld
entra en juego
Dynamic Library Install Name
: ruta al archivo binario (no .framework). Sí, tienen el mismo nombre, pero MyFramework.framework
es una packaged bundle
con el MyFramework
archivo binario y los recursos dentro.
Esta ruta al directorio puede ser absoluta o relativa (p @executable_path
. Ej . @loader_path
, @rpath
). La ruta relativa es más preferible porque se cambia junto con un ancla que es útil cuando distribuye su paquete como un solo directorio
ruta absoluta - ejemplo de Framework1
//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1
@executable_path
@executable_path - relativo a la entrada binaria -
Caso de uso de ejemplo de Framework2
: incrustar un Dynamic framework
en una aplicación
//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 - relativo al paquete que es propietario de este
caso de uso binario : framework con framework incrustado - Framework3_1 con Framework3_2 dentro
//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 - Ruta de búsqueda de Runpath
Ejemplo de Framework2
Anteriormente teníamos que configurar un Framework para trabajar con dyld. No es conveniente porque el mismo Framework no se puede usar con configuraciones diferentes
@rpath
es un concepto compuesto que se basa en partes externas (Aplicación) y anidadas (Marco dinámico):
Solicitud:
Marco Dinámico:
//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
* ../
- ir al padre del directorio actual
otool
- herramienta de visualización de archivos de objetos
//-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
cambiar los nombres de instalación de biblioteca compartida dinámica usando -rpath
CocoaPods
utiliza use_frameworks!
[Acerca de] para regular unDynamic Linker
[Vocabulario]
Link Binary with Libraries
y, de alguna manera, Xcode sabe copiarlos en el paquete de su aplicación, mientras que para marcos personalizados esto simplemente no sucede.