Xcode10-Dyld:未为库中安装的Pod加载库

Giu*_*nza 16 frameworks dyld cocoapods swift xcode10.1

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

  • MainAppTarget
  • 框架A

FrameworkA是唯一使用特定容器的容器,因此在我的容器文件中,

target 'MainAppTarget' do
    ...
end

target 'FrameworkA' do
    pod 'PodA'
end
Run Code Online (Sandbox Code Playgroud)

构建成功没有问题,但是当我在模拟器上运行该应用程序时,该应用程序立即崩溃并显示以下错误消息:

dyld: Library not loaded: @rpath/PodA.framework/PodA
  Referenced from: .../Build/Products/Development-iphonesimulator/FrameworkA.framework/FrameworkA
  Reason: image not found
Run Code Online (Sandbox Code Playgroud)

我尝试了所有常见的可疑程序(删除派生数据,清除数据,pod取消集成...),到目前为止没有任何效果。

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

该应用程序在Swift 4.2中。

Dav*_*ton 12

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

dyld: Library not loaded: @rpath/PodA.framework/PodA
  Referenced from: .../Build/Products/Development-iphonesimulator/FrameworkA.framework/FrameworkA
  Reason: image not found
Run Code Online (Sandbox Code Playgroud)

似乎很奇怪的第一件事是,正在加载的框架(FrameworkA.framework)的路径未嵌入应用程序内。检查MainAppTarget的“常规”选项卡,并确保该框架出现在“嵌入式​​二进制文件”和“链接的框架和库”部分中。

其次,@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)
...
Run Code Online (Sandbox Code Playgroud)

和框架二进制文件:

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)
...
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

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

在此处输入图片说明

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