繁体   English   中英

Xcode10 - dyld:未为框架中安装的 pod 加载库

[英]Xcode10 - dyld: Library not loaded for pod installed in framework

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

  • 主应用程序目标
  • 框架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 中。

从您的错误消息中,应该检查一些事项。

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

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

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

检查MainAppTarget的 Build Phases 是否包含 cocoapods 的[CP] Embed Pods Frameworks ,以及脚本的输入文件是否包含PodA框架的路径。 像这样(示例显示 Alamofire pod):

在此处输入图片说明

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

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

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

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

第三步:确保在Build Phases选项卡中Link Binary with Libraries (1 item)Embed Frameworks (1 item)确实存在。

在此处输入图片说明

在此处输入图片说明

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

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

target 'MainAppTarget' do
  pod 'PodA'
end

target 'FrameworkA' do
  pod 'PodA'
end

此问题仅在 iOS 13.3.1 上。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM