![](/img/trans.png)
[英]Library not loaded: @rpath/libswiftMetalKit.dylib in UITests in Xcode10
[英]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...)到目前为止没有任何效果。
知道为什么会发生这种情况,以及如何使其工作而不必在两个目标上都安装所有 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
)
$(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
是可见的(它可以链接到它),但是当应用程序启动时,它会尝试查找并加载FrameworkA
所需的动态框架PodA
,它看起来就像PodA
没有嵌入MainAppTarget
,因此应用程序崩溃并显示您看到的错误消息。
要解决此问题,请确保PodA
框架嵌入在MainAppTarget
。 具体来说,您需要确保最终的应用程序软件包中包含PodA.framework
在Framewokrs
子文件夹。 通常 cocoapods 会自动复制框架。
检查MainAppTarget
的 Build Phases 是否包含 cocoapods 的[CP] Embed Pods Frameworks
,以及脚本的输入文件是否包含PodA
框架的路径。 像这样(示例显示 Alamofire pod):
我已经使用您发布的详细信息设置了一个项目,但在我看来,cocoapods 在创建的工作区设置中会自动处理这种情况(您可以在此处查看我的演示项目: https : //github.com/DmitryBespalov/ StackOverflowPodFramework )。 如果您的设置不同,请告诉我详细信息,我可以进一步帮助您。
我也面临同样的问题。 您需要做的就是将您正在使用的第三方框架设置为例如:- PodA 作为可选而不是在构建阶段部分的链接二进制与库下的必需。 就这样。 再试一次,它将按预期运行。
注意:- 您需要在使用框架的应用程序中添加 PodA。 除了创建一个包含 PodA 的静态框架并在您的动态框架中使用这个新创建的静态框架之外,别无他法。
At first, check whether your CocoaPod is compatible (supported) or not
。
确保将FrameworkA
拖到项目常规设置选项卡中的Embedded Binaries
部分。 还要确保在Build Phases选项卡中有Embed Frameworks (1 item)
,并且其中包含FrameworkA
。
这是一个解决方案:
第一步:将FrameworkA.framework
拖放到项目导航中。 链接框架和库添加了这个库。
第二步:在 Xcode 中转到 Project > General > Embedded Binary > Add FrameworkA.framework
。
第三步:确保在Build Phases选项卡中Link Binary with Libraries (1 item)
和Embed Frameworks (1 item)
确实存在。
PS 我在 Xcode 10.2.1 中做到了,但在 Xcode 10.1 中它的工作方式相同。
您还必须将FrameworkA目标中的pod 'PodA'添加到MainAppTarget 中。
target 'MainAppTarget' do
pod 'PodA'
end
target 'FrameworkA' do
pod 'PodA'
end
此问题仅在 iOS 13.3.1 上。
您无法修复它,只能降级到 iOS 13.3 或等待 Xcode 新更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.