Приложение iOS с фреймворком на устройстве упало, dyld: библиотека не загружена, Xcode 6 Beta

Этот сбой был проблемой блокировки, в основном я использовал следующие шаги, чтобы воспроизвести проблему:

  • Создать проект Cocoa Touch Framework
  • Добавьте файл swift и класс Dog
  • Сборка фреймворка для устройства
  • Создайте приложение Single View в Swift
  • Импортировать фреймворк в проект приложения
  • Создание экземпляра класса swift из фреймворка во ViewController
  • Сборка и запуск приложения на устройстве

При запуске приложения произошел сбой, вот консольный журнал:

dyld: Library not loaded: @rpath/FrameworkTest03.framework/FrameworkTest03
  Referenced from: /var/mobile/Applications/FA6BAAC8-1AAD-49B4-8326-F30F66458CB6/FrameworkTest03App.app/FrameworkTest03App
  Reason: image not found

Я пытался собрать на устройствах iOS 7.1 и 8.0, у них обоих один и тот же сбой. Тем не менее, я могу собрать приложение и нормально работать на симуляторе. Также мне известно, что я могу изменить каркас с " Обязательный" на " Необязательный" в Link Binary With Libraries, но это не решило проблему полностью, приложение упало при создании экземпляра Dog. Поведение отличается на устройстве и симуляторе, я подозреваю, что мы не можем распространять фреймворк для устройства, использующего бета-версию XCode. Кто-нибудь может пролить свет на это?

36 ответов

Решение

На вкладке General цели есть поле Embedded Binaries. Когда вы добавляете фреймворк, сбой разрешается.

Ссылка здесь на форумах разработчиков Apple.

Для iOS больше или равно 8

Под вкладкой General цели в разделе Embedded Binaries добавьте платформу. Это скопирует фреймворк в скомпилированный, так что он может быть связан с во время выполнения.

введите описание изображения здесь

Почему это происходит? : потому что фреймворк, на который вы ссылаетесь, компилируется как динамически связанный фреймворк и, таким образом, связан с ним во время выполнения.

Примечание. Встраивание пользовательских каркасов поддерживается только в iOS > 8, поэтому следует альтернативное решение, которое работает на более старых версиях iOS.

Для iOS менее 8

Если вы имеете влияние на эту платформу (имеете доступ к исходному коду / процессу сборки), вы можете изменить эту платформу, чтобы она была статически связана, а не динамически связана. Это приведет к тому, что код будет включен в ваше скомпилированное приложение, а не связан с ним во время выполнения, и, следовательно, не нужно будет внедрять фреймворк.

Как: На вкладке "Настройка сборки" фреймворка в разделе "Связывание" измените тип Mach-O на "Статическая библиотека". Теперь вам не нужно включать фреймворк во встроенные двоичные файлы.

Статическая структура

Включая активы: для включения таких вещей, как изображения, аудио или файлы xib/nib, я рекомендую создать пакет (по существу, каталог, дополнительную информацию здесь bit.ly/ios_bundle), а затем загрузить ресурсы из пакета с помощью NSBundle.

Я получил эту же ошибку при попытке вручную добавить созданный фреймворк в мой проект. Просто перетаскивание фреймворка в ваш проект не будет достаточно хорошим. Это все равно, что быть на одной площадке, но не найти своих детей. Мне потребовалось несколько проб и ошибок, чтобы заставить его работать должным образом, но следующие шаги сделали это для меня.

1) Создайте свой фреймворк

  • Развейте свою структуру.
  • Как только ваша разработка будет завершена, COMMAND+B создайте свой фреймворк и убедитесь, что вы получили "Build Succeeded".

2) Доступ к вашей структуре

  • Как только ваш каркасный проект будет успешно создан, он будет готов для вас к доступу в вашем Products папка в вашем проекте.

  • Щелкните правой кнопкой мыши на вашем .framework и выберите "Показать в Finder".

3) Поместите фреймворк в свой проект

  • Перетащите .framework из окна Finder в папку "Framework" проекта вашего приложения.

4) Настройте проект приложения для фреймворка

  • Выберите верхний уровень в вашем проекте

  • Выберите цель

  • Перейдите в "Фазы сборки", затем "Связать двоичные файлы с библиотеками" и убедитесь, что ваша инфраструктура включена с опционально выбранным.

  • Все еще в "Фазы сборки", перейдите в верхний левый угол и выберите + кнопка. В раскрывающемся списке выберите "Фаза нового копирования файлов".

  • Прокрутите вниз до нового раздела "Копировать файлы" и убедитесь, что вы установили Destination в "Рамки". Оставьте подпуть пустым. Затем нажмите + Кнопка внизу слева.

  • Вам будет представлена ​​иерархия вашего проекта. Прокрутите вниз до папки "Frameworks", к которой вы добавили структуру на шаге 3, или найдите ее в строке поиска вверху. Выберите ваш фреймворк и нажмите "Добавить".

  • Убедитесь, что ваш фреймворк включен с выбранным "Code Sign On Copy".

5) Очистите, а затем запустите свой проект

  • COMMAND+SHIFT+K
  • COMMAND+R

Сначала попробуйте собрать после Ctrl +Option+Shift+K . Если все равно не получается, сделайте следующее.

Если кто-то сталкивается с этой ошибкой в ​​Xcode 8, тогда измените свой статус структуры на Необязательный вместо Обязательного на вкладке General вашей цели.

Я создал фреймворк с использованием Swift3/Xcode 8.1 и использовал его в проекте Objective-C/Xcode 8.1. Чтобы решить эту проблему, я должен был включить Always Embed Swift Standard Libraries вариант под Build Options,

Посмотрите на этот скриншот:

введите описание изображения здесь

Надеюсь, это поможет!

Мне пришлось (помимо того, что упомянуто здесь) добавить следующую строку в Пути поиска Runpath на вкладке Настройки сборки:
@executable_path/Frameworks

У меня такая же проблема в версии iOS 9.x

ПРОБЛЕМА IS: приложение вылетает, как только я открываю приложение с ошибкой ниже.
dyld: библиотека не загружена: /System/Library/Frameworks/UserNotifications.framework/UserNotifications Ссылка на: /var/containers/Bundle/Application/######/TestApp.app/TestApp Причина: изображение не найдено

Я решил эту проблему, изменив Required в Optional в Linked Frameworks and Libraries за UserNotifications.framework фреймворк.

Вам необходимо добавить каркас к новой фазе сборки файлов копирования, чтобы во время выполнения каркас копировался в комплект приложения.

См. Как добавить "Фаза сборки Copy Files" в мою Target для получения дополнительной информации.

Официальные документы Apple: https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html

Это ошибка времени выполнения, вызванная Dynamic Linker

dyld: Library not loaded: @rpath/...
...
Reason: image not found

Ошибка Library not loaded с @rpath указывает, что Dynamic Linker не может найти двоичный файл.

  1. Проверьте, добавлен ли динамический каркас в General -> Embedded Binaries

  2. Проверить @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 - относительно пакета, который является владельцем этого двоичного варианта
использования: фреймворк со встроенным фреймворком - 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

Framework2 пример

Раньше нам приходилось настраивать Framework для работы с dyld. Это неудобно, потому что один и тот же фреймворк нельзя использовать с разными конфигурациями.

@rpath представляет собой составную концепцию, которая опирается на внешние (приложение) и вложенные (динамический каркас) части:

  • Заявка:

    • Runpath Search Paths(LD_RUNPATH_SEARCH_PATHS) - определяет список шаблонов, которые заменяются на @rpath.
       @executable_path/../Frameworks
      
    • Обзор Build Phases -> Embed Frameworks -> Destination, Subpath узнать, где именно находится врезной каркас
  • Динамическая структура:

    • Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME) - указать, что @rpath используется вместе с путём локального пакета к двоичному файлу
      @rpath/Framework2.framework/subfolder1
      
//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! [О] для регулированияDynamic Linker

[Запас слов]

Если вы используете Xcode 11 или новее:

  1. Перейдите к настройкам вашей цели и выберите Общие.

  1. Прокрутите вниз доFrameworks, Libraries и Embedded Content.

  2. При необходимости убедитесь, что для параметра "Встроить" выбрано значение "Вставить и подписать" или "Вставить без подписи".

Добавьте фреймворк в Embedded Binaries

Затем очистить и построить.

Удивительно, но не все необходимые части документированы здесь, по крайней мере для Xcode 8.

В моем случае это был пользовательский фреймворк как часть того же рабочего пространства. Оказывается, он был построен неправильно. Основываясь на последнем ответе Джеремиху на эту тему:

https://forums.developer.apple.com/thread/4687

Я должен был установить Dynamic Library Install Name Base (DYLIB_INSTALL_NAME_BASE) под Build Settings платформы, а затем восстановить его. Было неправильно установлено $(LOCAL_LIBRARY_DIR) и мне пришлось изменить его на @rpath,

Таким образом, на этапе обработки ссылки, он инструктировал хост-приложение динамически загружать его во время выполнения из /Library/Frameworks/fw.Framework/fw (как в корне файловой системы), а не путь к приложению /Frameworks/fw.Framework/fw

Что касается всех других настроек: он должен быть в 3 местах Build Phases, но все они устанавливаются сразу, когда вы просто добавляете его в Embedded Binaries установка General вкладка хостинг приложения.

Мне не нужно было устанавливать дополнительные Copy Files фаза, которая кажется интуитивно избыточной по отношению к стадии вложения в любом случае. Проверяя хвостовую часть транскрипта сборки, мы можем убедиться, что в этом нет необходимости.

PBXCp /Users/xyz/Library/Developer/Xcode/DerivedData/MyApp-cbcnqafhywqkjufwsvbzckecmjjs/Build/Products/Debug-iphoneos/MyFramework.framework

[Многие подробные строки удалены, но это ясно из упрощенной расшифровки в пользовательском интерфейсе Xcode.]

Я до сих пор не знаю, почему Xcode установил DYLIB_INSTALL_NAME_BASE неправильно оцените меня.

Недавно столкнулся с этой проблемой при импорте CoreNFC на старых iPhone (например, iPhone 6) и Xcode (11.3.1). Я смог заставить его работать

  1. В ваших проектах выберите цель.
  2. Перейдите на вкладку Общие вверху.
  3. В разделе "Frameworks, Libraries and Embedded Content" добавьте framework (для меня это был CoreNFC). Повторите для других целей.
  4. Нажмите " Build Phases" вверху и разверните "Link Binary with Libraries".
  5. Сделайте проблемный фреймворк необязательным (из обязательного).

Это позволило мне компилировать для старых / новых iPhone без каких-либо изменений кода. Надеюсь, это поможет другим.

Моя среда: Cocos2d 2.0, Box2d, Цель C

В дополнение к другим ответам, приведенным выше, я, наконец, перешел на вкладку "Общие" и сделал WatchKit необязательным.

Целевые общие связанные фреймворки и библиотеки Watchkit.framework Необязательно

В моем случае решение состояло в том, чтобы удалить скомпилированную среду из Embedded Binaries, которая была отдельным проектом в рабочей области, очистить и перестроить его, и, наконец, повторно добавить в Embedded Binaries.

Если вы используете стороннюю платформу и используете Cocoapods в качестве менеджера зависимостей, попробуйте выполнить pod install чтобы освежить ваши стручки.

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

Решено для меня, сняв флажок "Копировать только при установке" на этапах сборки-> Вставить рамки

Для любого проекта или проекта Framework в Xcode, который использует модули, один простой способ избежать загрузки динамической библиотеки (dylb) - это настроить файл модуля на рукописный ввод в статическом режиме. Для этого просто убедитесь, что не написали следующую строку в своем файле модуля.

use_frameworks!

После удаления строки из файла, который вы сохранили, просто запустите из консоли:

$ pod update

Я была такая же проблема. Я попытался создать свой проект с iPhone, который я никогда не использовал прежде, и я не добавил новый фреймворк. Для меня уборка работала нормально (Shift + Command + K). Может быть, это потому, что я использую бета 5 Xcode 7 и iPhone 6 с iOS 9 Beta, но это сработало.

В моем случае мой проект написан target-c, а в библиотеке есть файлы Swift. Поэтому я изменил "Всегда встраивать Swift Стандартные библиотеки" на вкладке " Настройки сборки " моего проекта на " Да", и все стало совершенно нормально.

Простое решение - следовать этому скриншоту, после чего сбой исчезнет:

ht tps:https://stackru.com/images/51389d75a0d891883728592b27a8aa13c0f39ab9.png

Отмечено: это Xcode 11.5

Мне пришлось переключить XcodeKit.framework с «Не вставлять» -> «Вставить и подписать»

После того, как попробовал все методы, доступные в интернете, и мои собственные пробные и ошибочные трюки 100 раз. Наконец я смог решить это. - Апекша Саху 6 минут назад
Перейдите на iTunes в Mac -> учетные записи -> Авторизуйте этот компьютер - Apeksha Sahu 5 минут назад
Второй шаг.... Перейти к настройкам в настройках iPad и iPhone и переиндексации с идентификаторами и очистить доверие компьютеров все. Это сработало для меня............... После переустановки версии Mac OSHigh seria 10.13.15 из последней версии Mac OS seirra beta, до переустановки последней версии Xcode, после обновления всех сертификатов. и т. д. и т. д.... столько методов, сколько вы можете подумать -

Если есть модуль разработки Удалите приложение из симулятора, установите из модуля -> очистить -> запустить снова...

То же самое было, когда я создал новую схему конфигурации и сборки.

Таким образом, решение для меня было запустить

pod install

для этой вновь созданной конфигурации.

В Xcode 11

Я столкнулся с той же проблемой

Изменение "Не встраивать " на вкладке " Общие" > "Платформы, библиотеки и встроенный контент" по- прежнему приводило к той же ошибке.

Что для меня решило, так это добавление Framework на вкладку Build Phases > раздел Embed Frameworks.

--Обновлено ---

Я заметил, что в проектах, созданных в предыдущих версиях Xcode Embed Frameworks, раздел недоступен при работе в Xcode 11. Найдите следующие шаги для достижения решения:

1: Сначала нужно добавить новую копию файлы фазы при Построить Фазы вкладки.

2: Во-вторых, измените имя добавленной фазы на Embed Frameworks.

3: Измените место назначения на Frameworks.

4: Добавьте платформу, для которой произошла ошибка.

Попробуйте поменять флаг ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES (в более ранних версиях xcode: Embedded Content Contains Swift Code) в настройках сборки от НЕТ до ДА.

Хотя все говорят встраивать фреймворк во встроенные двоичные файлы, но это все равно не работает, потому что мы упускаем здесь один важный шаг.

Вот два правильных шага для добавления двоичных файлов на вкладке «Встроенные двоичные файлы»:

  1. Удалите фреймворк, выдающий ошибку, из «Связанных фреймворков и библиотек» на вкладке «Общие».

  2. Теперь добавьте удаленный фреймворк только на вкладке Embedded Binaries, и это все, что нужно сделать.

Запустите его на устройстве и сохраните эту улыбку ;)

Xcode 11

  1. Перейдите к настройкам вашей цели и выберите Общие.
  2. Ищите "Платформы, библиотеки и встроенный контент"
  3. Сохраните "Не вставлять" и убедитесь, что все ваши цели (если у вас их несколько) установили только свою собственную структуру, а не другие цели.

Для пользователей SumUp: если вы загружаете последнюю версию SumUpSDK.xcFramework, вам необходимо убедиться, что для нее установлено значение «Встроить и подписать» на вкладке «Общие» приложения в Target.

т.е. отменить приведенное выше утверждение (чтобы его было легче понять):

  1. Перейдите в «Навигатор проекта» (т.е. первый значок для отображения всех элементов проекта и т. Д.)

  2. Выберите свой проект в верхней части дерева.

  3. В меню в центре страницы (немного правее) выберите свое приложение в разделе «Цели».

  4. На верхней вкладке выберите «Общие».

  5. Прокрутите вниз до «Платформы, библиотеки и встроенный контент».

  6. Выберите свою библиотеку из списка

  7. В раскрывающемся списке рядом с ним выберите «Вставить и подписать».

  8. Чистый

  9. Восстановите и запустите.

Надеюсь, это поможет.

ЧАС

Другие вопросы по тегам