首页 > 解决方案 > Xcode10 - dyld:没有为框架中安装的 pod 加载库

问题描述

我有一个带有目标框架的项目。

FrameworkA 是唯一使用某个 pod 的,因此在我的 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 deintegrate ...)到目前为止没有任何效果。

知道为什么会发生这种情况,以及如何在不必在两个目标上安装所有 Pod 的情况下使其工作吗?

该应用程序在 Swift 4.2 中。

标签: swiftframeworkscocoapodsdyldxcode10.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 的“General”选项卡,并确保框架出现在“Embedded Binaries”和“Linked Frameworks and Libraries”部分。

其次,@rpathrunpath搜索路径列表的简写,它告诉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 确定)

这是构建的应用程序包的屏幕截图,显示了它的布局方式: 查找器窗口

您可以使用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)
...

推荐阅读