Можно ли включить фреймворк в другой фреймворк?

Я пишу фреймворк (называемый 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)

Могу ли я включить фреймворк в другой фреймворк? Это правильный способ сделать это? Как я могу устранить свою ошибку?

8
задан mipadi 18 August 2010 в 20:47
поделиться

2 ответа

Самый простой способ - использовать @rpath. Ваша конфигурация должна выглядеть так:

  1. Установите каталог установки RegExKit.framework в @rpath
  2. Установите каталог установки Lighthouse.frameworks в @rpath
  3. Установите пути поиска Runpath Lighthouse.framework в @loader_path/Frameworks
  4. Убедитесь, что RegExKit. framework скопирован в подпапку Framework файла Lighthouse.framework (для этого используйте пользовательскую фазу сборки)

Наконец, все приложения, связывающиеся с Lighthouse.framework, должны установить Runpath Search Paths в @loader_path/.../Frameworks

8
ответ дан 5 December 2019 в 17:32
поделиться

Да, вы можете.

Однако вам нужно, чтобы включенный фреймворк "знал", где он будет установлен в момент сборки; иначе dyld не сможет найти его во время выполнения, как вы видели.

Соответствующие настройки в XCode, если я правильно помню, это "Installation Directory" и "Framework Install Name". Последнее, вероятно, не будет иметь значения для вашего использования, но вам нужно, чтобы первое было чем-то вроде: @executable_path/../Frameworks/Lighthouse.framework/Versions/A/Frameworks/RegexKit.framework/Versions/A/

1
ответ дан 5 December 2019 в 17:32
поделиться