2010-08-18 2 views
8

Я пишу фреймворк (называемый Lighthouse.framework), который, в свою очередь, использует код из другой структуры (если точнее, RegexKit.framework). Я скопировал RegexKit.framework в моей собственной структуры, так что он имеет структуру, подобную следующей:Могу ли я включить структуру в другую структуру?

Lighthouse.framework/ 
    Versions/ 
    A/ 
     Frameworks/ 
     RegexKit.framework 
     Lighthouse 

Однако, когда я пытаюсь запустить приложение, которое использует Lighthouse.framework (мой каркас), я получаю следующая ошибка:

dyld: Library not loaded: @executable_path/../Frameworks/RegexKit.framework/Versions/A/RegexKit

Referenced from: /Users/mdippery/Developer/Projects/Current/lighthouse/build/Debug/Lighthouse.framework/Versions/A/Lighthouse

Reason: image not found

Очевидно, что загрузчик не находит RegexKit.

Here're пути загрузчик ожидает загрузки, любезно 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) 

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

+0

Вот как вы можете включить фреймворк в другую структуру. http://stackoverflow.com/a/27638841/1582217 Это называется зонтичной структурой. –

+0

Возможный дубликат [Как создать структуру Umbrella в iOS sdk?] (Http://stackoverflow.com/questions/27484997/how-to-create-an-umbrella-framework-in-ios-sdk) –

ответ

1

Я обнаружил исправление этой проблемы. Я включил некоторые идеи из ответа sbooth, но исправление было проще. Я запустил этот скрипт:

install_name_tool -change @executable_path/../Frameworks/RegexKit.framework/Versions/A/RegexKit @loader_path/Frameworks/RegexKit.framework/Versions/A/RegexKit "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.framework/Versions/A/${PRODUCT_NAME}" 

как сцена запуска сценария запуска.

Обратите внимание, что в общем случае вам необходимо изменить @executable_path/../ на @loader_path/, и все в порядке.

+0

Где вы установили этот скрипт сборки? В Рамочном продукте или в совокупном продукте? –

1

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

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

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

+0

Do I установить каталог установки при создании Lighthouse.framework (для Lighthouse.framework)? Я попробовал, но это не сработало (хотя, возможно, я сделал что-то не так). – mipadi

+0

@mipadi: Если вы не создаете 'RegExKit.framework', вы не сможете этого сделать. Почему вы хотите, чтобы RegExKit содержался в другой структуре? То, что вы делаете, будет отлично работать без этого. –

+0

Было бы неплохо, если бы потребители моих фреймворков должны были включать только мою инфраструктуру, а также не включать зависимости моей инфраструктуры. – mipadi

8

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

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

Наконец, любые приложения Линкина g to Lighthouse.framework должен установить пути поиска пути Путь к пути_loader_path /../ Frameworks

+0

Я не строю RegexKit.framework (я использую предварительно скомпилированный двоичный файл). Могу ли я установить для него каталог установки (я не видел, как это сделать)? – mipadi

+1

Вы можете использовать install_name_tool для этого - что-то вроде install_name_tool -change @executable_path /../ Frameworks @ rpath/Frameworks – sbooth

Смежные вопросы