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

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

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

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...)到目前为止没有任何效果。

知道为什么会发生这种情况吗?我如何才能使它工作而不必在两个目标上安装所有 pods?

该应用程序在 Swift 4.2.

我也遇到了同样的问题。您需要做的就是将您正在使用的第三方框架设置为例如:- PodA 在 Link binary with Libraries 的 build Phases 部分下作为 Optional 而不是 Required。就这样。再试一次,它会按预期 运行。

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

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

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 搜索路径列表的 shorthand,它告诉 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 可见(它可以 link 可见),但是当应用程序启动时,它尝试查找并加载 FrameworkA 所需的动态框架 PodA,看起来 PodA 未嵌入 MainAppTarget,因此应用程序崩溃并出现错误你看到的消息。

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

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

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

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

确保将 FrameworkA 拖到项目的常规设置选项卡中的 Embedded Binaries 部分。还要确保 Build Phases 选项卡中有 Embed Frameworks (1 item),并且其中包含 FrameworkA

Here's a solution:

第一步:将FrameworkA.framework拖放到项目导航中。 Link 框架和库添加了这个库。

第二步:在Xcode中转到项目>常规>嵌入式二进制>添加FrameworkA.framework

第三步:确保在构建阶段选项卡Link Binary with Libraries (1 item) Embed Frameworks (1 item) 确实存在。

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

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

target 'MainAppTarget' do
  pod 'PodA'
end

target 'FrameworkA' do
  pod 'PodA'
end

此问题仅在 iOS 13.3.1.

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

我有类似的问题。只是一些笔记。我正在使用导入 Pathkit 的 'pod Stencil'。突然出现这个错误'Library not loaded'。如果扩展错误并拆分 Reason: tried: 字符串,那么所有路径都在一行上。 走每条路,你可以在每条路上做一个终端'ls'。

虽然第一个应该指向 PathKit 的构建对象。

'/Users/USERNAME/Library/Developer/Xcode/DerivedData/APPNAME-gequ....op/Build/Products/Debug/PathKit.framework/Versions/A/PathKit' (no such file),

当我在第一条路径上执行 'ls' 时,找不到它。 但是如果你在Finder中打开它直到调试部分

'/Users/USERNAME/Library/Developer/Xcode/DerivedData/APPNAME-gequ....op/Build/Products/Debug/'

然后在 Version/A PathKit 对象确实存在下进一步挖掘。它有黑色图标

我将它们并排放置在 XCode 中的错误路径和实际文件路径中,我注意到 XCode 正在查看

"/Debug/PathKit.framework" 

应该一直在寻找

"/Debug/PathKit/PathKit.framework"

我无法修复它,但我认为这是我的文件夹布局。

我使用的工作区有两个子项目 ios 和 macos 在单独的文件夹中,工作区在公共父文件夹中,一个 Podfile 在父文件夹中。

Podfile 文件指定嵌套项目。

当我取出 ios 和 macos 项目并将它们放在自己的项目中并给它们自己的 podfile 时,应用程序已编译并且 运行 ok。找不到的库消失了。