swift - Xcode10 - dyld:没有为框架中安装的 pod 加载库
问题描述
我有一个带有目标框架的项目。
- 主应用目标
- 框架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”部分。
其次,@rpath
是runpath
搜索路径列表的简写,它告诉dyld
在哪里寻找所需的库。
这是 Github 上的一个示例项目,其主应用程序使用一个 Cocoapod,主应用程序依赖的动态框架使用不同的 Cocoapod:https ://github.com/dtweston/FrameworkPodTest
您应该检查所有涉及的目标的构建设置(包括由 Pods 项目构建的框架目标):
- 运行路径搜索路径 (
LD_RUNPATH_SEARCH_PATHS
)- 在示例项目中,这些是由 cocoapod 确定的,但每一个都设置为
$(inherited) @executable_path/Frameworks @loader_path/Frameworks
- 在示例项目中,这些是由 cocoapod 确定的,但每一个都设置为
- 动态库安装名称 (
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)
...
推荐阅读
- css - 如何使图像作为div的封面?
- mysql - 日期范围内的 COUNT CASE 函数
- mingw - Codelite/Mingw 运行测试构建而不是我想要的文件
- javascript - 使用下拉菜单更改元素的颜色
- wildfly - Wildfly16 使用 mqtt 支持设置嵌入式 Artemis
- c# - 更改代码以提高性能(渴望加载)
- javascript - 决定全局变量何时应该在函数内部或函数外部
- kubernetes - 在 GKE 集群上使用 Terraform 部署 Helm 工作负载
- javascript - 如何在 JavaScript 中按顺序编写返回参数的函数?
- reactjs - React 中的默认状态是如何设置的?