提问人:vladof81 提问时间:6/21/2014 最后编辑:yoAlex5vladof81 更新时间:11/13/2023 访问量:346674
带有框架的 iOS 应用程序在设备上崩溃,dyld:未加载库,Xcode 6 Beta
iOS app with framework crashed on device, dyld: Library not loaded, Xcode 6 Beta
问:
此崩溃是一个阻塞问题,我使用以下步骤重现该问题:
- 创建 Cocoa Touch Framework 项目
- 添加一个 swift 文件和一个类 Dog
- 为设备构建框架
- 在 Swift 中创建 Single View 应用程序
- 将框架导入应用项目
- 在 ViewController 中从框架实例化 swift 类
- 在设备上生成并运行应用
应用程序在启动时立即崩溃,这是控制台日志:
dyld: Library not loaded: @rpath/FrameworkTest03.framework/FrameworkTest03
Referenced from: /var/mobile/Applications/FA6BAAC8-1AAD-49B4-8326-F30F66458CB6/FrameworkTest03App.app/FrameworkTest03App
Reason: image not found
我尝试在 iOS 7.1 和 8.0 设备上构建,它们都有相同的崩溃。但是,我可以构建一个应用程序并在模拟器上运行。另外,我知道我可以在 Link Binary With Libraries 中将框架更改为 Required to Optional,但它并没有完全解决问题,当我创建 Dog 实例时应用程序崩溃了。设备和模拟器上的行为不同,我怀疑我们无法使用 Xcode 的 beta 版本为设备分发框架。谁能阐明这一点?
答:
您需要将框架添加到新的复制文件生成阶段,以确保在运行时将框架复制到应用程序包中。
有关更多信息,请参阅如何将“复制文件构建阶段”添加到我的 Target。
在目标的“常规”选项卡中,有一个“嵌入式二进制文件”字段。当您在此处添加框架时,崩溃将得到解决。
参考资料位于 Apple 开发者论坛上。
评论
Embed & Sign
对于大于或等于 8 的 iOS
在目标的“常规”选项卡下的“嵌入式二进制文件”部分中,添加框架。这会将框架复制到编译的框架中,以便可以在运行时链接到它。
为什么会发生这种情况?:因为要链接到的框架被编译为动态链接的框架,因此在运行时链接到。
** 注意:** 仅在 iOS > 8 中支持嵌入自定义框架,因此适用于旧版本 iOS 的替代解决方案如下。
对于小于 8 的 iOS
如果你影响了这个框架(有权访问源代码/构建过程),你可以将这个框架更改为静态链接而不是动态链接。这将导致代码包含在已编译的应用中,而不是在运行时链接到,因此不必嵌入框架。
** 如何:** 在框架的“构建设置”选项卡的“链接”部分中,将“Mach-O 类型”更改为“静态库”。现在,您不需要在嵌入式二进制文件下包含框架。
包括资产:要包含图像、音频或 xib/nib 文件等内容,我建议创建一个捆绑包(本质上是一个目录,此处 bit.ly/ios_bundle 更多信息),然后使用 NSBundle 从捆绑包加载资产。
评论
Swift is not supported for static libraries
我必须(在此提到的内容之上)将以下行添加到“构建设置”选项卡下的“运行路径搜索路径”中:
@executable_path/Frameworks
评论
我有同样的问题。我尝试使用以前从未使用过的 iPhone 构建我的项目,并且我没有添加新框架。对我来说,清理工作正常(Shift+Command+K)。也许是因为我使用了 Xcode 7 的 beta 5 和带有 iOS 6 Beta 的 iPhone 9,但它奏效了。
评论
我的环境:Cocos2d 2.0、Box2d、Objective C
除了执行上面的其他答案外,我最终还是转到了“常规”选项卡,并将 WatchKit 设为可选。
如果有人仍然遇到此问题,尽管遵循了许多其他答案中概述的所有步骤,则可能需要吊销并重新创建代码签名证书,如下所示:
https://developer.apple.com/library/ios/qa/qa1886/_index.html
评论
如果您使用的是第三方框架,并且使用 Cocoapods 作为依赖项管理器,请尝试执行 a 来刷新 pod。pod install
这次崩溃发生在我正在使用的第三方库上,很高兴上述解决方案对我有用,希望它对你有用!
就我而言,解决方案是从嵌入式二进制文件中删除已编译的框架,这是工作区中的一个独立项目,清理并重新构建它,最后重新添加到嵌入式二进制文件。
首先尝试在Command+Option+Shift+K之后构建。如果仍然失败,请执行以下步骤。
如果有人在 Xcode 8 中遇到此错误,请在目标的“常规”选项卡下将框架状态更改为“可选”而不是“必需”。
评论
令人惊讶的是,这里并没有记录所有必要的部分,至少对于 Xcode 8 来说是这样。
我的案例是一个定制的框架,作为同一工作区的一部分。事实证明,它的建造是错误的。根据 jeremyhu 对此线程的最后回应:
https://forums.developer.apple.com/thread/4687
我必须在框架项目下设置(),然后重新构建它。它被错误地设置为,我不得不将其更改为 .Dynamic Library Install Name Base
DYLIB_INSTALL_NAME_BASE
Build Settings
$(LOCAL_LIBRARY_DIR)
@rpath
因此,在 App Project 的链接处理阶段,它指示主机 App 在运行时从(如运行时文件系统的根目录)而不是 path-to-App 动态加载框架/Library/Frameworks/fw.Framework/fw
/Frameworks/fw.Framework/fw
关于所有其他设置:它确实必须在 中的 3 个位置,但是当您将其添加到托管应用程序选项卡的设置中时,这些设置都是一次性设置的。Build Phases
Embedded Binaries
General
我不必设置一个额外的阶段,无论如何,相对于嵌入阶段来说,这在直觉上似乎是多余的。通过检查构建脚本的尾端,我们可以确保这不是必需的。Copy Files
PBXCp /Users/xyz/Library/Developer/Xcode/DerivedData/MyApp-cbcnqafhywqkjufwsvbzckecmjjs/Build/Products/Debug-iphoneos/MyFramework.framework
[删除了许多冗长的行,但从 Xcode UI 中的简化脚本中可以清楚地看出。
我仍然不知道为什么 Xcode 错误地设置了我的值。DYLIB_INSTALL_NAME_BASE
我在iOS 9.x版本中遇到了同样的问题
ISSUE IS: App crashes as soon as I open the app with below error.
dyld: Library not loaded: /System/Library/Frameworks/UserNotifications.framework/UserNotifications Referenced from: /var/containers/Bundle/Application/######/TestApp.app/TestApp Reason: image not found
我已经通过更改为 in for framework 解决了这个问题。Required
Optional
Linked Frameworks and Libraries
UserNotifications.framework
评论
我使用 Swift3/Xcode 8.1 创建了一个框架,并在 Objective-C/Xcode 8.1 项目中使用它。要解决此问题,我必须启用 下的选项。Always Embed Swift Standard Libraries
Build Options
请看这张截图:
评论
仅仅将框架拖到项目中是不够的。这就像在同一个球场上,却找不到你的孩子。请按照下列步骤操作:
1) 创建框架
- 开发框架。
- 开发完成后,+ 构建框架并确保收到“构建成功”。
COMMAND
B
2) 访问您的框架
- 一旦你的框架项目成功构建,你就可以在项目的文件夹中访问它。
Products
- 右键单击您的并选择“在Finder中显示”。
.framework
3)将框架放在项目中
- 将 从 Finder 窗口拖放到应用项目的“Framework”文件夹中。
.framework
4) 为框架配置应用项目
- 选择项目中的顶层
- 选择您的目标
- 转到“构建阶段”,然后转到“将二进制文件与库链接”,并确保您的框架包含在可选选项中。
- 仍在“构建阶段”中,转到左上角并选择按钮。在下拉列表中,选择“新建复制文件阶段”。
+
- 向下滚动到新的“复制文件”部分,并确保设置为“框架”。将子路径留空。然后单击左下角的按钮。
Destination
+
- 您将看到您的项目层次结构。向下滚动到您在第 3 步中将框架添加到的“框架”文件夹,或在顶部的搜索栏中搜索它。选择您的框架,然后单击“添加”。
- 确保框架包含在选中的“代码登录副本”中。
5) 清理,然后运行你的项目
COMMAND
+SHIFT
+K
COMMAND
+R
评论
如果开发 pod 从模拟器中删除您的应用程序,从 pod 安装->清理 - >再次运行...
然后清理并构建。
- 转到 xcode 中的文件 -> 工作区设置
- 点按旁边出现的箭头 /Users/apple/Library/Developer/Xcode/DerivedData
- 选择派生数据并将其移至废纸篓。
- 相当xcode并重新打开它。
- 清理项目并再次运行。
以上步骤解决了我的问题。
在尝试了互联网上可用的所有方法和我自己的试错技巧 100 次之后。最后,我能够解决它。– Apeksha Sahu 6 分钟前 在 Mac 中转到 iTunes -->帐户-->授权此计算机 – Apeksha Sahu 5 分钟前
第二步....在iPad和iPhone的设置中转到开发人员,并使用标识符重新索引,并清除信任计算机的所有内容。它对我有用........ .......重新安装 Mac OSHigh seria 10.13.15 版本后,从 Mac OS seirra beta 最新版本,到重新安装 Xcode 最新版本,更新所有证书后。等等等等......你能想到我做过的尽可能多的方法。–
当我创建一个新的配置和构建方案时,也是如此。
所以对我来说,解决方案是运行
pod install
对于这个新创建的配置。
通过在Build Phases->Embed Frameworks上取消选择“仅安装时复制”为我解决了这个问题
评论
尝试将“构建设置”中的标志(在早期的 xcode 版本中:)从 NO 更改为 YES。ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES
Embedded Content Contains Swift Code
就我而言,我的项目是由 objective-c 编写的,库中有 Swift 文件。因此,我将项目的“构建设置”选项卡中的“始终嵌入 Swift 标准库”更改为“是”,结果完全没问题。
如果您使用的是 Xcode 11 或更高版本:
- 导航到目标的设置,然后选择“常规”。
向下滚动到框架、库和嵌入内容。
如有必要,请确保为“嵌入”选项选择了“嵌入并签名”或“嵌入而不签名”值。
评论
Xcode 11的
- 导航到目标的设置,然后选择常规。
- 查找“框架、库和嵌入内容”
- 保持“不要嵌入”,并确保你的所有目标(如果你有多个)只设置了自己的框架,而不是其他目标。
在 Xcode 11 中
我面临着同样的问题
将“常规”选项卡中的“不嵌入”更改为“框架、库和嵌入内容”>仍然会导致相同的错误。
为我解决的是将框架添加到“构建阶段”选项卡>“嵌入框架”部分
--更新---
我观察到,在以前版本的 Xcode 中构建的项目中,嵌入框架部分在 Xcode 11 中运行时不可用,请找到以下步骤来实现解决方案:
1:首先需要在“构建阶段”选项卡下添加“新建复制文件阶段”。
2:第二步,将添加阶段的名称更改为Embed Frameworks
3:将目标更改为“框架”。
4:添加发生错误的框架。
dyld:未加载库:@rpath/<some_path>
这是由以下原因引起的运行时错误Dynamic Linker
dyld: Library not loaded: @rpath/<some_path>
Referenced from: <some_path>
Reason: image not found
错误 with 表示找不到二进制文件。Library not loaded
@rpath
Dynamic Linker
检查动态框架是否已添加到前面的目标。将框架拖放到使用 [About] 进行投影并错过将框架添加为隐式依赖项(或签入)非常简单
。在这种情况下,在编译时,Xcode 将其构建为成功,但当您运行它时,您会收到运行时错误General -> Frameworks, Libraries, and Embedded Content (Embedded Binaries)
Copy items if needed
Frameworks, Libraries, and Embedded Content
Add to targets
检查消费者(应用程序)和生产者(动态框架)之间的设置:
@rpath
- 动态框架:
Build Settings -> Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
.默认值为$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)
- 应用:
Build Settings -> Runpath Search Paths(LD_RUNPATH_SEARCH_PATHS)
.默认值为 ,@executable_path/Frameworks
$(inherited)
Build Phases -> Embed Frameworks -> Destination, Subpath
动态链接器
动态库安装名称(LD_DYLIB_INSTALL_NAME),
由(作为派生)使用,其中发挥作用
- 二进制文件(不是.framework)的路径。是的,它们具有相同的名称,但其中包含二进制文件和资源。
此目录路径可以是绝对路径,也可以是相对路径(例如,,)。相对路径更可取,因为它与定位点一起更改,当您将捆绑包分发为单个目录时,定位点很有用loadable bundle
Dynamic framework
dyld
Dynamic Library Install Name
MyFramework.framework
packaged bundle
MyFramework
@executable_path
@loader_path
@rpath
绝对路径 - Framework1 示例
//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1
Relative path
允许您以动态方式定义路径。
@executable_path
@executable_path - 相对于加载框架
用例的可执行二进制文件:内部(应用程序二进制路径
是 @executable_path) 或更复杂的示例,其中 [About] 是 with inside 的一部分。目标(应用程序二进制路径为 @executable_path)和目标(应用扩展二进制路径为 @executable_path))有 2 - Framework2 示例Dynamic framework
Application
App Extension
Containing App
Dynamic Framework
@executable_path
Application
App Extension
//Application bundle(`.app` package) absolute path
/some_path/Application.аpp
//Application binary absolute path
/some_path/Application.аpp/subfolder1
//Framework2 binary absolute path
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1
//Framework2 @executable_path == Application binary absolute path <-
/some_path/Application.аpp/subfolder1
//Framework2 Dynamic Library Install Name
@executable_path/../Frameworks/Framework2.framework/subfolder1
//Framework2 binary resolved absolute path by dyld
/some_path/Application.аpp/subfolder1/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1
@loader_path
@loader_path - 相对于导致加载框架的 bundle。如果它是一个应用程序,那么它将与
用例相同:带有嵌入式框架的框架 - Framework3_1内部有Framework3_2@executable_path
//Framework3_1 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1
//Framework3_2 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1
//Framework3_1 @executable_path == Application binary absolute path <-
/some_path/Application.аpp/subfolder1
//Framework3_1 @loader_path == Framework3_1 @executable_path <-
/some_path/Application.аpp/subfolder1
//Framework3_2 @executable_path == Application binary absolute path <-
/some_path/Application.аpp/subfolder1
//Framework3_2 @loader_path == Framework3_1 binary absolute path <-
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1
//Framework3_2 Dynamic Library Install Name
@loader_path/../Frameworks/Framework3_2.framework/subfolder1
//Framework3_2 binary resolved absolute path by dyld
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1/../Frameworks/Framework3_2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1
@rpath - 运行路径搜索路径
Framework2 示例
以前,我们必须设置一个框架来与 dyld 一起使用。这并不方便,因为相同的框架不能用于不同的配置。由于此设置是在框架目标端进行的,因此无法为不同的消费者(应用程序)配置相同的框架
@rpath
是一个依赖于外部(应用程序)和嵌套(动态框架)部分的复合概念:
应用:
Runpath Search Paths(LD_RUNPATH_SEARCH_PATHS)
-@rpath
- 定义一个模板列表,该列表将替换为 。消费者使用单词指向此列表@rpath
@rpath
@executable_path/../Frameworks
查看以确定嵌入框架的确切位置
Build Phases -> Embed Frameworks -> Destination, Subpath
动态框架:
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
- 与二进制文件的本地捆绑包路径一起使用的点@rpath
@rpath/Framework2.framework/subfolder1
//Application Runpath Search Paths
@executable_path/../Frameworks
//Framework2 Dynamic Library Install Name
@rpath/Framework2.framework/subfolder1
//Framework2 binary resolved absolute path by dyld
//Framework2 @rpath is replaced by each element of Application Runpath Search Paths
@executable_path/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1
*../
- 转到当前目录的父目录
otool
- 目标文件显示工具
//-L print shared libraries used
//Application otool -L
@rpath/Framework2.framework/subfolder1/Framework2
//Framework2 otool -L
@rpath/Framework2.framework/subfolder1/Framework2
//-l print the load commands
//Application otool -l
LC_LOAD_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2
LC_RPATH
@executable_path/../Frameworks
//Framework2 otool -l
LC_ID_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2
install_name_tool
使用更改动态共享库安装名称-rpath
CocoaPods
使用 [About] 来调节use_frameworks!
Dynamic Linker
评论
虽然每个人都说要在嵌入式二进制文件下嵌入框架,但它仍然不起作用,因为我们在这里错过了一个重要的步骤。
以下是在“嵌入式二进制文件”选项卡下添加二进制文件的两个正确步骤:
从“常规”选项卡下的“链接框架和库”中删除出现错误的框架。
现在,仅在“嵌入式二进制文件”选项卡下添加已删除的框架,这就是所有需要做的。
在设备上运行它并保持微笑;)
对于 Xcode 中使用 pod 的任何项目或框架项目,避免动态库 (dylb) 不加载的一种简单方法是将 pod 文件设置为静态模式下的墨迹。为此,请确保不要在 pod 文件中写入以下行。
use_frameworks!
从保存的文件中删除行后,只需从控制台运行:
$ pod update
最近在较旧的 iphone(例如 iPhone 6)和 Xcode (11.3.1) 上导入 CoreNFC 时遇到了这个问题。我能够让它工作
- 在“项目”中,选择目标。
- 转到顶部的“常规”选项卡。
- 在“框架、库和嵌入内容”部分下,添加框架(对我来说是 CoreNFC)。对其他目标重复上述步骤。
- 单击顶部的 Build Phases,然后展开 “Link Binary with Libraries”。
- 将麻烦的框架设置为可选(从必需开始)。
这使我能够在不进行任何代码更改的情况下为较旧/较新的 iPhone 进行编译。我希望这对其他人有所帮助。
评论
就我而言,应用程序仅在真实设备上崩溃,并且发生在标准库中。 我之前尝试了很多步骤,1小时后,我只是从真实设备中删除应用程序并重新安装。
对于 SumUp 用户,如果要加载最新的 SumUpSDK.xcFramework,则需要确保从应用程序的 Target 的 General 选项卡将其设置为“Embed & Sign”。
即颠倒上述陈述(使其更容易理解):
转到“项目导航器”(即显示所有项目的第一个图标等)
从树的顶部选择您的项目。
在页面中间的菜单上(稍微偏右),在“目标”下选择您的应用程序
从顶部选项卡中,选择“常规”
向下滚动到“框架、库和嵌入内容”
从列表中选择您的库
从旁边的下拉列表中选择“嵌入和签名”。
干净
重新生成并运行。
我希望这会有所帮助。
H
对我来说,我不得不将 XcodeKit.framework 从“Do Not Embed” -> “Embed & Sign” 切换
评论
就我而言,这是问题
运行脚本
我刚刚删除了运行脚本及其工作
如果您在控制台中除了登录答案之外还得到了这个:
原因:未找到合适的图像。确实发现了:
您的框架可能是为比您的应用程序更高的部署版本构建的。例如,应用程序是为 iOS 12 构建的,框架是为 iOS 14 构建的,而你在 iOS 12 设备上运行。
评论
Link Binary with Libraries