Я пишу фреймворк (называемый Lighthouse.framework), который, в свою очередь, использует код из другого фреймворка (RegexKit.framework, точнее). Я скопировал RegexKit.framework в свой собственный фреймворк, так что он имеет следующую структуру:
Lighthouse.framework/
Versions/
A/
Frameworks/
RegexKit.framework
Lighthouse
Однако, когда я пытаюсь запустить приложение, которое использует Lighthouse.framework (мой фреймворк), я получаю следующую ошибку:
dyld: библиотека не загружена: @executable_path /../ Frameworks / RegexKit.framework / Versions / A / RegexKit
Ссылка на: / Users / mdippery / Разработчик / Проекты / Текущий / Маяк / Сборка / Отладка / Маяк. framework / Versions / A / Lighthouse
Причина: изображение не найдено
Очевидно, загрузчик не находит RegexKit.
Вот пути, которые загрузчик ожидает загрузить, любезно otool
:
build/Debug/Lighthouse.framework/Versions/A/Lighthouse:
/Users/mdippery/Library/Frameworks/Lighthouse.framework/Versions/A/Lighthouse (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 12.0.0)
@executable_path/../Frameworks/RegexKit.framework/Versions/A/RegexKit (compatibility version 0.4.0, current version 0.6.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 476.19.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 677.26.0)
Могу ли я включить фреймворк в другой фреймворк? Это правильный способ сделать это? Как я могу устранить свою ошибку?
Самый простой способ - использовать @rpath. Ваша конфигурация должна выглядеть так:
Наконец, все приложения, связывающиеся с Lighthouse.framework, должны установить Runpath Search Paths в @loader_path/.../Frameworks
Да, вы можете.
Однако вам нужно, чтобы включенный фреймворк "знал", где он будет установлен в момент сборки; иначе dyld
не сможет найти его во время выполнения, как вы видели.
Соответствующие настройки в XCode, если я правильно помню, это "Installation Directory" и "Framework Install Name". Последнее, вероятно, не будет иметь значения для вашего использования, но вам нужно, чтобы первое было чем-то вроде: @executable_path/../Frameworks/Lighthouse.framework/Versions/A/Frameworks/RegexKit.framework/Versions/A/