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

问题描述 投票:13回答:4

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

  • 出界
  • 骨架

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

swift frameworks cocoapods dyld xcode10.1
4个回答
8
投票

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

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项目构建的框架目标):

  • Runpath搜索路径(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
投票

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

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

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

enter image description here

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


1
投票

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

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

这是一个解决方案:

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

第二步:在Xcode中,转到Project> General> Embedded Binary> Add FrameworkA.framework

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

enter image description here

enter image description here

附:我是在Xcode 10.2.1中完成的,但在Xcode 10.1中,它的工作方式相同。


0
投票

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

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


-1
投票

您还必须将Framework目标中的pod'PodS'添加到MainApp Target中。

target 'MainAppTarget' do
  pod 'PodA'
end

target 'FrameworkA' do
  pod 'PodA'
end
© www.soinside.com 2019 - 2024. All rights reserved.