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

时间:2018-11-22 20:50:34

标签: swift frameworks cocoapods dyld xcode10.1

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

  • MainAppTarget
  • FrameworkA

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

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

该应用程序在Swift 4.2中。

6 个答案:

答案 0 :(得分:7)

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

dyld: Library not loaded: @rpath/PodA.framework/PodA
  Referenced from: .../Build/Products/Development-iphonesimulator/FrameworkA.framework/FrameworkA
  Reason: image not found

看起来很奇怪的第一件事是,正在加载的框架(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确定)

下面是构建的应用程序捆绑的屏幕截图,显示了其布局: Finder window

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

答案 1 :(得分:1)

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

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

检查MainAppTarget的构建阶段是否包含cocoapods的[CP] Embed Pods Frameworks,并且脚本的输入文件是否包含PodA框架的路径。诸如此类(示例显示Alamofire吊舱):

enter image description here

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

答案 2 :(得分:1)

  

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

确保将FrameworkA拖到项目的“常规设置”标签中的Embedded Binaries部分。另外,请确保您在 构建阶段 标签中有Embed Frameworks (1 item),并且其中包含FrameworkA

  

这是一个解决方案:

第一步:在项目导航中拖放FrameworkA.framework。链接框架和库添加了此库。

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

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

enter image description here

enter image description here

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

答案 3 :(得分:0)

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

注意:-您需要在使用框架的应用程序中添加PodA。 除了创建包含PodA的静态框架并在动态框架中使用此新创建的静态框架之外,没有其他方法。

答案 4 :(得分:-1)

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

target 'MainAppTarget' do
  pod 'PodA'
end

target 'FrameworkA' do
  pod 'PodA'
end

答案 5 :(得分:-2)

此问题仅在iOS 13.3.1上出现。

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

相关问题