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

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

  • MainAppTarget
  • FrameworkA

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

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

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

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

Приложение в Swift 4.2.

Ответы [ 5 ]

0 голосов
/ 24 мая 2019

Вы должны добавить pod 'PodA' в FrameworkA target в MainAppTarget также.

target 'MainAppTarget' do
  pod 'PodA'
end

target 'FrameworkA' do
  pod 'PodA'
end
0 голосов
/ 22 апреля 2019

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

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

Вот решение:

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

Шаг второй : в XCode перейдите в Project> General> Embedded Binary> Add 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 он работает так же.

0 голосов
/ 19 апреля 2019

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

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список путей поиска, который указывает dyld, где искать нужные библиотеки.

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

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

  • Пути поиска Runpath(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)
...
0 голосов
/ 21 апреля 2019

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

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

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

enter image description here

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

0 голосов
/ 26 ноября 2018

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

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

...