Це помилка виконання, яку викликає Dynamic Linker
dyld: Library not loaded: @rpath/...
...
Reason: image not found
Помилка Library not loaded
з @rpath
вказує , що Dynamic Linker
не може знайти двійковий файл.
Перевірте, чи було додано динамічну основу General -> Embedded Binaries
Перевірте @rpath
налаштування між споживачем (додаток) та виробником (динамічний фреймворк):
- Динамічні рамки:
Build Settings -> Dynamic Library Install Name
- Застосування:
Build Settings -> Runpath Search Paths
Build Phases -> Embed Frameworks -> Destination, Subpath
Динамічний лінкер
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
який використовується loadable bundle
( Dynamic framework
як похідна), де dyld
вступає в гру
Dynamic Library Install Name
- шлях до бінарного файлу (не .framework). Так, вони мають таке ж ім'я, але MyFramework.framework
це packaged bundle
з MyFramework
двійковим файлом і ресурсами всередині.
Цей шлях до директорії може бути абсолютним або відносним (наприклад @executable_path
, @loader_path
, @rpath
). Відносний шлях є більш кращим, оскільки він змінюється разом з якорем, що корисно, коли ви розповсюджуєте пакет як єдиний каталог
абсолютний шлях - приклад Framework1
//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1
@executable_path
@executable_path - відносно вхідного двійкового запису - приклад
використання прикладного Framework2
: вбудовано Dynamic framework
додаток
//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 - відносно пакету, який є власником цього бінарного
випадку використання: Framework з вбудованим фреймворком - Framework3_1 з Framework3_2 всередині
//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
Рамка2Приклад
Раніше нам довелося налаштувати Framework для роботи з dyld. Це не зручно, оскільки один і той же Framework не може використовуватися з різними конфігураціями
@rpath
це складна концепція, яка спирається на зовнішні (додатки) та вкладені (динамічні рамки) частини:
Застосування:
Динамічна рамка:
//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
*../
- перейдіть до батьківського поточного каталогу
otool
- інструмент відображення об'єктного файлу
//-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
змінити динамічні імена встановлення спільної бібліотеки за допомогою -rpath
CocoaPods
використовує use_frameworks!
[About] для регулюванняDynamic Linker
[Лексика]
Link Binary with Libraries
і Xcode якось знає скопіювати їх у свій додаток, тоді як для користувацьких рамок цього просто не відбувається.