我有一个带有目标框架的项目。
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中。
答案 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的“常规”选项卡,并确保该框架出现在“嵌入式二进制文件”和“链接的框架和库”部分中。
第二,@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)
...
答案 1 :(得分:1)
构建成功的原因是PodA
的框架在编译期间对FrameworkA
是可见的(可以链接到它),但是当应用程序启动时,它将尝试查找并加载该框架。 PodA
所需的动态框架FrameworkA
,并且PodA
似乎没有嵌入MainAppTarget
中,因此应用程序崩溃并显示错误消息。>
要解决此问题,请确保PodA
框架已嵌入MainAppTarget
中。具体来说,您需要确保最终的应用程序捆绑包在PodA.framework
子文件夹中包含Framewokrs
。通常,cocoapods会自动复制框架。
检查MainAppTarget
的构建阶段是否包含cocoapods的[CP] Embed Pods Frameworks
,并且脚本的输入文件是否包含PodA
框架的路径。诸如此类(示例显示Alamofire吊舱):
我已经用您发布的详细信息设置了一个项目,但是在我看来,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)
确实存在。>
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新更新。