Xcode10 - dyld: библиотека не загружена для модуля, установленного в платформе

У меня есть проект с целевыми рамками.

  • MainAppTarget
  • FrameworkA

FrameworkA - единственный, кто использует определенный модуль, поэтому в моем файле модуля есть что-то вроде

target 'MainAppTarget' do
    ...
end

target 'FrameworkA' do
    pod 'PodA'
end

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

dyld: Library not loaded: @rpath/PodA.framework/PodA
  Referenced from: .../Build/Products/Development-iphonesimulator/FrameworkA.framework/FrameworkA
  Reason: image not found

Я пытался все обычные подозреваемые (удалить производные данные, очистить, под дезинтегрировать...), пока ничего не получалось.

Любая идея, почему это произойдет, и как я могу заставить его работать без необходимости устанавливать все модули обязательно на обеих целях?

Приложение находится в Swift 4.2.

Ответы

Ответ 1

Из вашего сообщения об ошибке следует проверить несколько вещей.

dyld: Library not loaded: @rpath/PodA.framework/PodA
  Referenced from: .../Build/Products/Development-iphonesimulator/FrameworkA.framework/FrameworkA
  Reason: image not found

Первое, что кажется странным, это то, что путь к загружаемой платформе (FrameworkA.framework) не встроен в приложение. Проверьте вкладку "Общие" MainAppTarget и убедитесь, что платформа отображается в разделах "Встроенные двоичные файлы" и "Связанные фреймворки и библиотеки".

Во-вторых, @rpath является сокращением runpath поиска runpath, который сообщает dyld где искать нужные библиотеки.

Вот пример проекта на Github с основным приложением, использующим один Cocoapod, и динамической платформой, от которой зависит основное приложение и использующей другой Cocoapod: https://github.com/dtweston/FrameworkPodTest

Создайте настройки, которые вы должны проверить по всем задействованным целям (включая целевые рамки, созданные проектом Pods):

  • Пути поиска пути выполнения (LD_RUNPATH_SEARCH_PATHS)
    • В примере проекта они определяются cocoapod, но для каждого из них установлено значение $(inherited) @executable_path/Frameworks @loader_path/Frameworks
  • Имя установки динамической библиотеки (LD_DYLIB_INSTALL_NAME)
    • В примере проекта это значение не отличается от значения по умолчанию $(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)
  • База имен динамической установки библиотеки (DYLIB_INSTALL_NAME_BASE)
    • В примере проекта установите @rpath (снова определяется Cocoapod)

Вот скриншот встроенного пакета приложений, показывающий, как он выложен: Finder window

Вы можете использовать otool для получения информации о том, как приложение собирается с помощью xcodebuild.

Вот основное двоичное приложение:

otool -L FrameworkPodTest
FrameworkPodTest:
    @rpath/KeychainSwift.framework/KeychainSwift (compatibility version 1.0.0, current version 1.0.0)
    @rpath/Lottie.framework/Lottie (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 61000.0.0)
    @rpath/Framework.framework/Framework (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1560.10.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
    /System/Library/Frameworks/CoreGraphics.framework/CoreGraphics (compatibility version 64.0.0, current version 1245.9.2)
...

И каркас бинарный:

otool -L Frameworks/Framework.framework/Framework
Frameworks/Framework.framework/Framework:
    @rpath/Framework.framework/Framework (compatibility version 1.0.0, current version 1.0.0)
    @rpath/KeychainSwift.framework/KeychainSwift (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1560.10.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
    @rpath/libswiftCore.dylib (compatibility version 1.0.0, current version 1000.11.42)
    @rpath/libswiftCoreFoundation.dylib (compatibility version 1.0.0, current version 1000.11.42)
...

Ответ 2

Причина, по которой сборка завершается успешно, заключается в том, что платформа PodA видна FrameworkA во время компиляции (она может ссылаться на нее), но когда приложение запускается, оно пытается найти и загрузить динамический каркас PodA требуемый FrameworkA, и выглядит как PodA не встроен в MainAppTarget, поэтому приложение вылетает с сообщением об ошибке, которое вы видели.

Чтобы это исправить, убедитесь, что платформа PodA встроена в MainAppTarget. В частности, вам необходимо убедиться, что окончательный комплект приложений содержит PodA.framework в Framewokrs. Обычно cocoapods копирует рамки автоматически.

Убедитесь, что этапы сборки для MainAppTarget содержат фреймворки Cocoapods [CP] Embed Pods Frameworks и что входные файлы сценариев содержат путь к структуре PodA. Примерно так (пример показывает Alamofire pod):

enter image description here

Я создал проект с подробностями, которые вы опубликовали, но мне кажется, что cocoapods автоматически обрабатывает этот случай в настройке созданного рабочего пространства (вы можете посмотреть мой демонстрационный проект здесь: https://github.com/DmitryBespalov/StackOverflowPodFramework). Если ваши настройки отличаются, пожалуйста, дайте мне знать детали, и я могу помочь вам в этом.

Ответ 3

At first, check whether your CocoaPod is compatible (supported) or not.

Убедитесь, что вы перетащили FrameworkA в раздел Embedded Binaries на вкладке General settings вашего проекта. Также убедитесь, что у вас есть Embed Frameworks (1 item) на вкладке Build Phases, и там есть FrameworkA.

Вот решение:

Шаг первый: перетащите FrameworkA.framework в ваш проект навигации. Ссылка рамки и библиотеки добавил эту библиотеку.

Шаг второй: В XCode перейдите к Проекту> Общие> Встроенный двоичный файл> Добавить FrameworkA.framework.

Шаг третий: Убедитесь, что на вкладке " Фазы сборки " существуют Link Binary with Libraries (1 item) и " Embed Frameworks (1 item).

enter image description here

enter image description here

PS Я сделал это в Xcode 10.2.1, но в Xcode 10.1 он работает так же.

Ответ 4

Я тоже столкнулся с той же проблемой. Все, что вам нужно сделать, - это установить сторонние фреймворки, для которых вы используете, например: - PodA как Необязательный вместо Обязательный в бинарном Link с библиотеками в разделе Фазы сборки. Все это. попробуйте еще раз, и он будет работать, как ожидалось.

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

Ответ 5

Вы также должны добавить модуль PodA в целевой среде FrameworkA в MainAppTarget.