带有框架的 iOS 应用程序在设备上崩溃,dyld:未加载库,Xcode 6 Beta

iOS app with framework crashed on device, dyld: Library not loaded, Xcode 6 Beta

提问人:vladof81 提问时间:6/21/2014 最后编辑:yoAlex5vladof81 更新时间:11/13/2023 访问量:346674

问:

此崩溃是一个阻塞问题,我使用以下步骤重现该问题:

  • 创建 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 版本为设备分发框架。谁能阐明这一点?

iOS Swift 框架 dyld 动态库

评论

3赞 fatuhoku 2/17/2016
我不明白的是,为什么所有其他第三方框架都是开箱即用的,可以很容易地拖放到其中,并且 Xcode 以某种方式知道将它们复制到您的应用程序包中,而对于自定义框架,这根本不会发生。Link Binary with Libraries
0赞 Ankit Kumar 4/28/2016
萨扎德·希桑·汗(Sazzad Hissain Khan)在这里的回答 stackoverflow.com/questions/26024100/...是最好的答案。
1赞 Vinayak Parmar 9/1/2018
看看这个 stackoverflow.com/a/52129141/2020034。它有效
0赞 mohsen 3/4/2019
你可以做一个胖库,你可以看到这个链接: stackoverflow.com/a/54977145/3992606
0赞 Jimmy KD 4/18/2019
Xcode版本不匹配,用 stackoverflow.com/a/55738882/5443510 解决。

答:

26赞 liamnichols 6/21/2014 #1

您需要将框架添加到新的复制文件生成阶段,以确保在运行时将框架复制到应用程序包中。

有关更多信息,请参阅如何将“复制文件构建阶段”添加到我的 Target

官方 Apple 文档:https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/CreatingaCopyFilesBuildPhase.html

1073赞 vladof81 6/22/2014 #2

在目标的“常规”选项卡中,有一个“嵌入式二进制文件”字段。当您在此处添加框架时,崩溃将得到解决。

参考资料位于 Apple 开发者论坛上。

评论

82赞 loretoparisi 9/18/2014
我在嵌入式二进制文件中有框架,并且将复制阶段也设置为“框架”。无论如何它都会崩溃。
13赞 Saad Ur Rehman 12/9/2014
这仅在调试模式下解决。存档或生成项目时将再次发生错误
17赞 ArdenDev 1/6/2015
将@executable_path/框架添加到“运行路径搜索路径”解决了这个问题,即除了将框架添加到“嵌入式二进制文件”之外
3赞 Md Rais 12/3/2015
我已经在“嵌入式二进制文件”部分添加了框架,但如果允许应用程序在装有 iOS 9.1 的设备上运行,则应用程序仍然崩溃,并在控制台中显示消息“dyld:库未加载:原因:未找到图像”,因为应用程序在模拟器上平稳运行。
9赞 luckyhandler 1/9/2020
您必须在“框架、库和嵌入内容”中为您的 SharedCode 框架设置Embed & Sign
272赞 Dawson 2/12/2015 #3

对于大于或等于 8 的 iOS

在目标的“常规”选项卡下的“嵌入式二进制文件”部分中,添加框架。这会将框架复制到编译的框架中,以便可以在运行时链接到它。

enter image description here

为什么会发生这种情况?:因为要链接到的框架被编译为动态链接的框架,因此在运行时链接到。

** 注意:** 仅在 iOS > 8 中支持嵌入自定义框架,因此适用于旧版本 iOS 的替代解决方案如下。

对于小于 8 的 iOS

如果你影响了这个框架(有权访问源代码/构建过程),你可以将这个框架更改为静态链接而不是动态链接。这将导致代码包含在已编译的应用中,而不是在运行时链接到,因此不必嵌入框架。

** 如何:** 在框架的“构建设置”选项卡的“链接”部分中,将“Mach-O 类型”更改为“静态库”。现在,您不需要在嵌入式二进制文件下包含框架。

Static Framework

包括资产:要包含图像、音频或 xib/nib 文件等内容,我建议创建一个捆绑包(本质上是一个目录,此处 bit.ly/ios_bundle 更多信息),然后使用 NSBundle 从捆绑包加载资产。

评论

2赞 Cruinh 8/15/2015
这应该是“大于或等于 8”。我也不得不在iOS 8上这样做。
0赞 jose920405 5/12/2016
错误Swift is not supported for static libraries
29赞 Aviel Gross 3/26/2015 #4

我必须(在此提到的内容之上)将以下行添加到“构建设置”选项卡下的“运行路径搜索路径”中:
@executable_path/Frameworks

enter image description here

评论

0赞 mattv123 1/21/2017
这太奇怪了,默认情况下不包括在内。如果你解压缩并查看你的IPA,你应该在Payloads/appname.app/Frameworks/中找到你的框架。但是,添加此搜索路径必须存在,应用才能在运行时在此文件夹中查找。奇怪。
5赞 henrik-dmg 8/17/2015 #5

我有同样的问题。我尝试使用以前从未使用过的 iPhone 构建我的项目,并且我没有添加新框架。对我来说,清理工作正常(Shift+Command+K)。也许是因为我使用了 Xcode 7 的 beta 5 和带有 iOS 6 Beta 的 iPhone 9,但它奏效了。

评论

0赞 Grifas 10/13/2017
也许还有一个干净的构建文件夹(CMD+Shift+Alt+K)
10赞 Jim Rota 8/23/2015 #6

我的环境:Cocos2d 2.0、Box2d、Objective C

除了执行上面的其他答案外,我最终还是转到了“常规”选项卡,并将 WatchKit 设为可选。

Target General Linked Frameworks and Libraries Watchkit.framework Optional

-3赞 Sam 10/6/2015 #7

如果有人仍然遇到此问题,尽管遵循了许多其他答案中概述的所有步骤,则可能需要吊销重新创建代码签名证书,如下所示:

https://developer.apple.com/library/ios/qa/qa1886/_index.html

评论

0赞 igraczech 8/17/2016
完全。代码签名与此错误无关。
0赞 SaadurRehman 11/17/2020
在这种特殊情况下,签名证书不受信任或不在钥匙串中,签名无效是实际错误,后跟未找到库。所以我会支持这个答案。然而,它不适合有问题的日志,但它会帮助某人。干杯!
8赞 NYC Tech Engineer 12/16/2015 #8

如果您使用的是第三方框架,并且使用 Cocoapods 作为依赖项管理器,请尝试执行 a 来刷新 pod。pod install

这次崩溃发生在我正在使用的第三方库上,很高兴上述解决方案对我有用,希望它对你有用!

9赞 Andrea Leganza 6/9/2016 #9

就我而言,解决方案是从嵌入式二进制文件中删除已编译的框架,这是工作区中的一个独立项目,清理并重新构建它,最后重新添加到嵌入式二进制文件。

52赞 Desert Rose 9/12/2016 #10

首先尝试在Command+Option+Shift+K之后构建。如果仍然失败,请执行以下步骤。

如果有人在 Xcode 8 中遇到此错误,请在目标的“常规”选项卡下将框架状态更改为“可选”而不是“必需”。

enter image description here

评论

6赞 nsinvocation 9/16/2016
这将使运行时无法识别框架中的类
0赞 Adam Mendoza 9/17/2016
@azimov是正确的。我现在正面临这种困境。必需会导致“找不到图像”错误,如果我们尝试将其设置为可选,它将在运行时崩溃并显示“无法识别的选择器”
1赞 Adam Mendoza 9/18/2016
即使我的框架已经在链接二进制文件和嵌入中,我仍然必须添加一个复制阶段。dyld:未加载库:@rpath/AFNetworking.framework/AFNetworking 引用自:/Users/{User}/Library/Developer/CoreSimulator/Devices/6833A85C-5783-45FA-A4D5-991D286B28C2/data/Containers/Bundle/Application/B1A0A3B2-92A2-41B0-9884-6DB6995A0D7E/MyApp.app/MyApp 原因:未找到图像 (lldb) 解决方案:项目 -> 目标 -> 构建阶段 -> + 在顶部添加新的 复制文件阶段 目标 = 框架 选择需要复制的框架
0赞 jbouaziz 9/22/2016
@AdamMendoza,我的应用程序因此被拒绝了。
0赞 Adam Mendoza 9/22/2016
@jbouaziz,是的,您可能会遇到的错误是由于 .framework 很胖,这意味着除了必要的 armv7 arm64 之外,它还具有 iOS 不支持的架构,例如 i386 x86_64。商店会给你一个错误,但你可能不会在 Xcode 中看到这个错误。使用 Xcode -> Open Developer Tool -> Application Loader 下的加载器。SolutionL 让它变薄,看 -> ikennd.ac/blog/2015/02/...
12赞 BaseZen 10/25/2016 #11

令人惊讶的是,这里并没有记录所有必要的部分,至少对于 Xcode 8 来说是这样。

我的案例是一个定制的框架,作为同一工作区的一部分。事实证明,它的建造是错误的。根据 jeremyhu 对此线程的最后回应:

https://forums.developer.apple.com/thread/4687

我必须在框架项目下设置(),然后重新构建它。它被错误地设置为,我不得不将其更改为 .Dynamic Library Install Name BaseDYLIB_INSTALL_NAME_BASEBuild Settings$(LOCAL_LIBRARY_DIR)@rpath

因此,在 App Project 的链接处理阶段,它指示主机 App 在运行时从(如运行时文件系统的根目录)而不是 path-to-App 动态加载框架/Library/Frameworks/fw.Framework/fw/Frameworks/fw.Framework/fw

关于所有其他设置:它确实必须在 中的 3 个位置,但是当您将其添加到托管应用程序选项卡的设置中时,这些设置都是一次性设置的。Build PhasesEmbedded BinariesGeneral

不必设置一个额外的阶段,无论如何,相对于嵌入阶段来说,这在直觉上似乎是多余的。通过检查构建脚本的尾端,我们可以确保这不是必需的。Copy Files

PBXCp /Users/xyz/Library/Developer/Xcode/DerivedData/MyApp-cbcnqafhywqkjufwsvbzckecmjjs/Build/Products/Debug-iphoneos/MyFramework.framework

[删除了许多冗长的行,但从 Xcode UI 中的简化脚本中可以清楚地看出。

我仍然不知道为什么 Xcode 错误地设置了我的值。DYLIB_INSTALL_NAME_BASE

28赞 jfalexvijay 11/4/2016 #12

我在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 解决了这个问题。RequiredOptionalLinked Frameworks and LibrariesUserNotifications.framework

评论

0赞 BergP 2/22/2018
我收到“警告:无法执行支持代码以在此过程中读取 Objective-C 类数据。这可能会降低可用类型信息的质量。
0赞 Gowtham Sooryaraj 7/17/2018
它起作用了,也许原因是某些框架没有在模拟器中运行,这就是为什么
50赞 NeverHopeless 11/10/2016 #13

我使用 Swift3/Xcode 8.1 创建了一个框架,并在 Objective-C/Xcode 8.1 项目中使用它。要解决此问题,我必须启用 下的选项。Always Embed Swift Standard LibrariesBuild Options

请看这张截图:

enter image description here

评论

3赞 Harish 11/11/2016
这现在对我有用。此问题的解决方案是转到 BuildPhases -> Copy Files ->在 Destination 下选择 Framework 并添加您的框架。您的图书馆可能在这里丢失。
0赞 NeverHopeless 11/11/2016
@Harish,您建议的解决方案已经由几个人提出,我肯定会在第一时间处理这个问题。就我而言,框架已添加到那里,但仍然出现了同样的问题。然后我自己挖。如果你对这个解决方案投了反对票,我不知道为什么你对你的方式非常确定,而它在我的情况下不起作用:S
0赞 Swaroop S 2/27/2018
太棒了,这个东西有效,因为如果使用 swift 库或 pod 嵌入到目标 C 项目中。目标 C 项目通常将此标志设置为 No。
145赞 Brandon A 4/4/2017 #14

仅仅将框架拖到项目中是不够的。这就像在同一个球场上,却找不到你的孩子。请按照下列步骤操作:

1) 创建框架

  • 开发框架。
  • 开发完成后,+ 构建框架并确保收到“构建成功”。COMMANDB

enter image description here

2) 访问您的框架

  • 一旦你的框架项目成功构建,你就可以在项目的文件夹中访问它。Products

enter image description here

  • 右键单击您的并选择“在Finder中显示”。.framework

enter image description here

3)将框架放在项目中

  • 将 从 Finder 窗口拖放到应用项目的“Framework”文件夹中。.framework

enter image description here

4) 为框架配置应用项目

  • 选择项目中的顶层

enter image description here

  • 选择您的目标

enter image description here

  • 转到“构建阶段”,然后转到“将二进制文件与库链接”,并确保您的框架包含在可选选项中

enter image description here

  • 仍在“构建阶段”中,转到左上角并选择按钮。在下拉列表中,选择“新建复制文件阶段”。+

enter image description here

  • 向下滚动到新的“复制文件”部分,并确保设置为“框架”。将子路径留空。然后单击左下角的按钮。Destination+

enter image description here

  • 您将看到您的项目层次结构。向下滚动到您在第 3 步中将框架添加到的“框架”文件夹,或在顶部的搜索栏中搜索它。选择您的框架,然后单击“添加”。

enter image description here

  • 确保框架包含在选中的“代码登录副本”中。

enter image description here

5) 清理,然后运行你的项目

  • COMMAND+SHIFT+K
  • COMMAND+R

评论

7赞 DàChún 9/11/2017
好点子。它几乎对我有用。我做了一个框架A,其中包括Alamofire。我的主机App(嵌入式框架A)在模拟器中工作。但是当我尝试在真正的 iPhone 中运行它时,它会崩溃并出现错误:Alamofire:dyld:库未加载:@rpath/Alamofire.framework/Alamofire 原因:未找到合适的图像。确实发现:xxx/ddcdemo.app/Frameworks/iddc.framework/Frameworks/Alamofire.framework/Alamofire:mach-o,但架构错误
1赞 Mitesh Dobareeya 11/10/2017
@Brandon 使框架可选解决了我的问题。但是你能解释一下使框架可选的行为是什么吗?
2赞 Andi 2/27/2018
谢谢!在您的第 5 步中,我选中了“仅在安装时复制”,这是我的问题。
2赞 Rajesh Kumar 12/15/2017 #15

如果开发 pod 从模拟器中删除您的应用程序,从 pod 安装->清理 - >再次运行...

13赞 Vineesh TP 3/8/2018 #16

在嵌入式二进制文件中添加框架enter image description here

然后清理并构建。

0赞 john raja 5/2/2018 #17
  1. 转到 xcode 中的文件 -> 工作区设置
  2. 点按旁边出现的箭头 /Users/apple/Library/Developer/Xcode/DerivedData
  3. 选择派生数据并将其移至废纸篓。
  4. 相当xcode并重新打开它。
  5. 清理项目并再次运行。

以上步骤解决了我的问题。

1赞 Apeksha Sahu 6/27/2018 #18

在尝试了互联网上可用的所有方法和我自己的试错技巧 100 次之后。最后,我能够解决它。– Apeksha Sahu 6 分钟前 在 Mac 中转到 iTunes -->帐户-->授权此计算机 – Apeksha Sahu 5 分钟前

第二步....在iPad和iPhone的设置中转到开发人员,并使用标识符重新索引,并清除信任计算机的所有内容。它对我有用........ .......重新安装 Mac OSHigh seria 10.13.15 版本后,从 Mac OS seirra beta 最新版本,到重新安装 Xcode 最新版本,更新所有证书后。等等等等......你能想到我做过的尽可能多的方法。–
enter image description here

2赞 atereshkov 9/12/2018 #19

当我创建一个新的配置和构建方案时,也是如此。

所以对我来说,解决方案是运行

pod install

对于这个新创建的配置。

8赞 Shohin 11/14/2018 #20

enter image description here

通过在Build Phases->Embed Frameworks上取消选择“仅安装时复制”为我解决了这个问题

评论

1赞 Cerniuk 11/25/2018
如果系统不相信“debug install”不是“install”,那么最好知道这个复选框的意义。无论如何,如果它导致应用程序在硬件上崩溃,而不是通过警告禁止应用程序运行,那么这是一个巧妙的另一个 Xcode 缺陷
1赞 Vittal Pai 2/12/2019 #21

尝试将“构建设置”中的标志(在早期的 xcode 版本中:)从 NO 更改为 YES。ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIESEmbedded Content Contains Swift Code

4赞 User18474728 3/21/2019 #22

就我而言,我的项目是由 objective-c 编写的,库中有 Swift 文件。因此,我将项目的“构建设置”选项卡中的“始终嵌入 Swift 标准库”更改为“是”,结果完全没问题。

18赞 Tamás Sengel 9/24/2019 #23

如果您使用的是 Xcode 11 或更高版本

  1. 导航到目标的设置,然后选择“常规”。

Target Settings/General

  1. 向下滚动到框架、库和嵌入内容

  2. 如有必要,请确保为“嵌入”选项选择了“嵌入并签名”或“嵌入而不签名”值。

Frameworks, Libraries and Embedded Content section

评论

0赞 Yunus Tek 8/13/2021
我应该选择哪一个,这两个选项是什么意思?
0赞 alekop 2/15/2022
选择“嵌入并签名”会在“嵌入框架”>“生成阶段”下添加框架。这就像一条捷径。但是手动添加它对我不起作用。我不得不删除它,然后选择“嵌入并登录”,然后问题就消失了。
1赞 Matias Jurfest 10/28/2019 #24

Xcode 11的

  1. 导航到目标的设置,然后选择常规。
  2. 查找“框架、库和嵌入内容”
  3. 保持“不要嵌入”,并确保你的所有目标(如果你有多个)只设置了自己的框架,而不是其他目标。
2赞 vinay 11/12/2019 #25

Xcode 11

我面临着同样的问题

“常规”选项卡中的“不嵌入”更改为“框架、库和嵌入内容”>仍然会导致相同的错误。

为我解决的是将框架添加到“构建阶段”选项卡>“嵌入框架”部分

--更新---

我观察到,在以前版本的 Xcode 中构建的项目中,嵌入框架部分在 Xcode 11 中运行时不可用,请找到以下步骤来实现解决方案:

1:首先需要在“构建阶段”选项卡下添加“新建复制文件阶段”。

enter image description here

2:第二步,将添加阶段的名称更改为Embed Frameworks enter image description here

3:将目标更改为“框架”。

enter image description here

4:添加发生错误的框架。

enter image description here

20赞 yoAlex5 12/7/2019 #26

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@rpathDynamic Linker

  1. 检查动态框架是否已添加到前面的目标。将框架拖放到使用 [About] 进行投影并错过将框架添加为隐式依赖项(或签入)非常简单
    。在这种情况下,在编译时,Xcode 将其构建为成功,但当您运行它时,您会收到运行时错误
    General -> Frameworks, Libraries, and Embedded Content (Embedded Binaries)Copy items if neededFrameworks, Libraries, and Embedded ContentAdd to targets

  2. 检查消费者(应用程序)和生产者(动态框架)之间的设置:@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
  1. 框架的 [about] - 动态库和应用程序的 [about] - 不嵌入。Mach-O fileFrameworks, Libraries, and Embedded Content

动态链接器

动态库安装名称(LD_DYLIB_INSTALL_NAME),由(作为派生)使用,其中发挥作用
- 二进制文件(不是.framework)的路径。是的,它们具有相同的名称,但其中包含二进制文件和资源。
此目录路径可以是绝对路径,也可以是相对路径(例如,,)。相对路径更可取,因为它与定位点一起更改,当您将捆绑包分发为单个目录时,定位点很有用
loadable bundleDynamic frameworkdyldDynamic Library Install NameMyFramework.frameworkpackaged bundleMyFramework@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 frameworkApplicationApp ExtensionContaining AppDynamic Framework@executable_pathApplicationApp 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

[词汇]

[Java 类加载器]

评论

1赞 nahung89 8/10/2020
很好的解释!了解这一点并 stackoverflow.com/a/59216858/2082851,那么您将了解链接和嵌入式框架的行为以及相关问题。
1赞 learner 12/25/2019 #27

虽然每个人都说要在嵌入式二进制文件下嵌入框架,但它仍然不起作用,因为我们在这里错过了一个重要的步骤。

以下是在“嵌入式二进制文件”选项卡下添加二进制文件的两个正确步骤:

  1. 从“常规”选项卡下的“链接框架和库”中删除出现错误的框架。

  2. 现在,仅在“嵌入式二进制文件”选项卡下添加已删除的框架,这就是所有需要做的。

在设备上运行它并保持微笑;)

5赞 Stéphane de Luca 1/5/2020 #28

对于 Xcode 中使用 pod 的任何项目或框架项目,避免动态库 (dylb) 不加载的一种简单方法是将 pod 文件设置为静态模式下的墨迹。为此,请确保不要在 pod 文件中写入以下行。

use_frameworks!

从保存的文件中删除行后,只需从控制台运行:

$ pod update
11赞 whawhat 2/8/2020 #29

最近在较旧的 iphone(例如 iPhone 6)和 Xcode (11.3.1) 上导入 CoreNFC 时遇到了这个问题。我能够让它工作

  1. “项目”中,选择目标。
  2. 转到顶部的“常规”选项卡。
  3. 在“框架、库和嵌入内容”部分下,添加框架(对我来说是 CoreNFC)。对其他目标重复上述步骤。
  4. 单击顶部的 Build Phases,然后展开 “Link Binary with Libraries”。
  5. 将麻烦的框架设置为可选(从必需开始)。

这使我能够在不进行任何代码更改的情况下为较旧/较新的 iPhone 进行编译。我希望这对其他人有所帮助。

评论

1赞 Newsonic 4/20/2020
不起作用,应用程序崩溃,并且没有消息指示崩溃类型,而不是某些汇编代码上的断点。
0赞 rohitwtbs 6/8/2020
为什么需要这样做才能成为可选的?
0赞 Bozzo 10/26/2020 #30

就我而言,应用程序仅在真实设备上崩溃,并且发生在标准库中。 我之前尝试了很多步骤,1小时后,我只是从真实设备中删除应用程序并重新安装。

1赞 Heider Sati 2/7/2021 #31

对于 SumUp 用户,如果要加载最新的 SumUpSDK.xcFramework,则需要确保从应用程序的 Target 的 General 选项卡将其设置为“Embed & Sign”。

即颠倒上述陈述(使其更容易理解):

  1. 转到“项目导航器”(即显示所有项目的第一个图标等)

  2. 从树的顶部选择您的项目。

  3. 在页面中间的菜单上(稍微偏右),在“目标”下选择您的应用程序

  4. 从顶部选项卡中,选择“常规”

  5. 向下滚动到“框架、库和嵌入内容”

  6. 从列表中选择您的库

  7. 从旁边的下拉列表中选择“嵌入和签名”。

  8. 干净

  9. 重新生成并运行。

我希望这会有所帮助。

H

3赞 Alex.Pinhasov 5/9/2021 #32

对我来说,我不得不将 XcodeKit.framework 从“Do Not Embed” -> “Embed & Sign” 切换

enter image description here

评论

0赞 JCutting8 8/13/2021
这允许东西编译和运行,但是我在上传到 App Store 时遇到了结构不良模块的问题。
0赞 Muhammad Awais Jamil 5/21/2022 #33

就我而言,这是问题

运行脚本

我刚刚删除了运行脚本及其工作

0赞 Bogdan 1/14/2023 #34

如果您在控制台中除了登录答案之外还得到了这个:

原因:未找到合适的图像。确实发现了:

您的框架可能是为比您的应用程序更高的部署版本构建的。例如,应用程序是为 iOS 12 构建的,框架是为 iOS 14 构建的,而你在 iOS 12 设备上运行。