【问题标题】:Xcode10 - dyld: Library not loaded for pod installed in frameworkXcode10 - dyld:没有为框架中安装的 pod 加载库
【发布时间】:2019-04-25 13:02:57
【问题描述】:

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

  • MainAppTarget
  • 框架A

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 中。

【问题讨论】:

  • 您提到在模拟器上运行它时它会崩溃。在设备上运行正常吗?
  • @Giuseppe Lanza,您是否运行调试配置或任何其他自定义配置?

标签: swift frameworks cocoapods dyld xcode10.1


【解决方案1】:

这个问题只出现在 iOS 13.3.1 上。

无法修复,只能降级到 iOS 13.3 或等待 Xcode 新更新。

【讨论】:

    【解决方案2】:

    您还必须将 FrameworkA 目标中的 pod 'PodA' 添加到 MainAppTarget 中。

    target 'MainAppTarget' do
      pod 'PodA'
    end
    
    target 'FrameworkA' do
      pod 'PodA'
    end
    

    【讨论】:

    • 这是一个不错的临时解决方法。它的一个问题是,如果你在那个 FrameworkA 中有一个 swiftUI,并运行 Canvas 来预览它,它就不会运行。
    【解决方案3】:

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

    确保您已将FrameworkA 拖到项目“常规设置”选项卡中的Embedded Binaries 部分。还要确保您在 Build Phases 选项卡中有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)确实存在。

    附:我在 Xcode 10.2.1 中做到了,但在 Xcode 10.1 中它的工作方式相同。

    【讨论】:

    • 尝试了同样的方法,但仍然没有遇到同样的问题。 Xcode:11.3.1 和 macOS 10.15.3。
    【解决方案4】:

    构建成功的原因是PodA框架在编译期间对FrameworkA是可见的(它可以链接到它),但是当应用程序启动时,它会尝试查找并加载动态框架@987654326 @ 是FrameworkA 所必需的,并且看起来PodA 没有嵌入到MainAppTarget 中,因此应用程序崩溃并显示您看到的错误消息。

    要解决此问题,请确保 PodA 框架嵌入在 MainAppTarget 中。具体来说,您需要确保最终的应用程序包在Framewokrs 子文件夹中包含PodA.framework。通常 cocoapods 会自动复制框架。

    检查MainAppTarget 的构建阶段是否包含cocoapods 的[CP] Embed Pods Frameworks,并且脚本的输入文件是否包含PodA 框架的路径。像这样的东西(示例显示 Alamofire pod):

    我已经使用您发布的详细信息设置了一个项目,但在我看来,cocoapods 会在创建的工作区设置中自动处理这种情况(您可以在此处查看我的演示项目:https://github.com/DmitryBespalov/StackOverflowPodFramework)。如果您的设置不同,请告诉我详细信息,我可以进一步帮助您。

    【讨论】:

    • 嘿,虽然我在您的项目中看到一切正常,并且 cocoapods 也正确地将 pod 链接到主要目标,但由于某种原因,在我的项目中并非如此。我试图用 deintegrate/clean 从 cocoapods 中清理整个项目,我注意到该项目没有得到完全清理。我手动清理了其他链接器标志、框架搜索路径和标题搜索路径。不幸的是 pod install 没有修复。项目中的 pod 仍然没有链接,并且脚本 Embed Pods Framework 确实是错误的。知道为什么会发生这种情况吗?
    【解决方案5】:

    根据您的错误消息,有几件事需要检查。

    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)
    ...
    

    【讨论】:

    • 嘿戴夫,谢谢你的回答。我会尽快对此进行测试。
    • 谢谢你,它为我节省了很多时间。我只需要在“嵌入式​​二进制文件”和“链接框架和库”部分添加框架。
    【解决方案6】:

    我也面临同样的问题。您需要做的就是将您正在使用的第三方框架设置为例如:- PodA 为可选,而不是在构建阶段部分中将二进制文件与库链接下的必需。就这样。再试一次,它会按预期运行。

    注意:- 您需要在使用框架的应用程序中添加 PodA。 除了创建一个包含 PodA 的静态框架并在动态框架中使用这个新创建的静态框架之外,别无他法。

    【讨论】:

    • 如果我将 PodA 添加到主目标,则无需将 pod 设置为可选。让 PodA 成为主要目标正是我想要避免的。
    • 那么你需要按照“注意”中提到的步骤进行
    • 再次。这正是我想要避免的。
    猜你喜欢
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2019-08-18
    • 2019-01-01
    • 2015-06-03
    • 2020-09-17
    • 1970-01-01
    • 2015-12-20
    相关资源
    最近更新 更多