不要嵌入、嵌入并签名、嵌入但不签名。它们是什么?它们的作用是什么?

129

Xcode11 Beta中的“框架、库和嵌入式内容”部分有三个新选项,可用于添加库。

Xcode库部分截图

输入图片描述

请问有人能解释一下它们的作用吗?


1
我猜“嵌入”意味着“复制到应用程序包中”。我还猜测“签名”位实际上意味着使用您的凭据“重新签名”。 - trojanfoe
4个回答

71

正如@przemyslaw-jablonski所述,这与Xcode 10中的情况类似,但只有一个屏幕(我个人喜欢这样!)。


嵌入

不要嵌入静态框架和库(链接发生在构建时),仅嵌入共享框架和库(动态链接发生在运行时,因此它们需要在您的包中)。

file frameworkToLink.framework/frameworkToLink将返回:

  • current ar archive:静态库,请选择Do not embed
  • Mach-O dynamically linked:共享库,请选择Embed

签名(仅适用于共享/嵌入)

如果已经具有正确的签名,则不需要签名(adhoc不计入在内)。

codesign -dv frameworkToLink.framework将返回:

  • code object is not signed at alladhoc:请选 Embed and sign
  • 其他任何内容:已经正确签名,请选择Embed Without Signing

1
如果file的结果是Mach-O通用二进制文件,那么应该做出什么正确选择? - wzso
2
关于 codesign,我发现如果框架使用 adhoc 签名进行签名,仍然需要对其进行签名,否则应用程序将无法启动。 - wzso
@Mint:通用二进制意味着它在底层具有不同的架构。底层的架构应该告诉您它们是存档还是动态库。 - agirault
3
这是否也适用于标准框架,例如AdSupport.framework,或者它们应该设置为“不嵌入”,因为它们已经存在于设备上? - cauende
1
好问题。那个框架不是静态的吗?我认为如果你知道它将在目标系统上可用,即使它是共享的,也不应该嵌入它。最好的方法是在不嵌入它的情况下进行测试,如果无法加载该库,则会在运行时抱怨。请告诉我们,以便我们可以相应地编辑答案! - agirault

15

在Xcode 10中,项目设置(点击具有蓝色图标的.xcodeproj文件)中有两个与框架相关的部分可见 - Embedded Binaries 和 Linked Frameworks and Libraries。现在它们合并为一个部分。

Do Not Embed 选项基本上是将给定的.framework 链接到项目中。

Embed & SignEmbed Without Signing 是旧的嵌入选项。

除了在组装期间是否签署框架之外,我不确定最后两者之间的功能差异。如果您想知道链接和嵌入之间的区别,则可以在这里找到关于此问题的SO答案。

图片:

Xcode 10

Xcode 11


之前在“链接的框架和库”下,选项是“必需的”和“可选的”。那么,“必需的”是否等同于“不嵌入”? - RBz
2
@RBz 不是的,“optional”状态是为了支持早期版本作为弱依赖项。请查看手册:https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html - dimpiax

14

Xcode v11. 框架、库和嵌入内容以及带嵌入与不带嵌入的框架和库

enter image description here

历史

Embedded Binaries, Linked Frameworks and Libraries -> Frameworks, Libraries, and Embedded Content

[Xcode pre-v11. Embedded Binaries, Linked Frameworks and Libraries]这个选项在Xcode v11之前存在于General标签中,是依赖管理的一部分[关于]

Xcode v11添加了以下内容:

  • 应用程序目标 - Frameworks、Libraries和Embedded Content
  • 框架或应用扩展目标 - Frameworks和Libraries

嵌入

Embed

它将一个框架的副本添加到最终的bundle中。然后,Dynamic linker :dyld加载或运行时尝试使用@rpath[关于]查找嵌入的框架。如果找不到,则会出现错误[dyld: Library not loaded]

EmbedBuild Phases -> Embed Frameworks是相同的。在此处,您可以设置bundle的文件夹和Subpath

Do Not Embed

Static Linker在编译时尝试将代码从静态库复制到可执行对象文件中,使用Build Settings -> Framework Search Paths

Do Not EmbedBuild Phases -> Link Binary With Libraries是相同的。SignCode Sign On Copy是相同的。

如果您没有将静态框架添加到此部分,则会出现编译错误[No such module]

结果:

  • 静态库
  • 静态框架 - 不嵌入
  • 动态框架 - 嵌入

*请注意,嵌入的优先级高于Mach-O Type[关于]

  • 应用程序的Frameworks、Libraries...Embed,而框架的Mach-OStatic Library - 结果为动态框架。
  • 应用程序的Frameworks、Libraries...Do Not Embed,而框架的Mach-ODynamic Library - 结果为错误dyld: Library not loaded[关于]
App's Embed (Dynamic) -> Framework's Mach-O Static - Dynamic
App's Do Not Embed(Static) -> Framework's Mach-O Dynamic - error

[静态链接器 vs 动态链接器]
[何时使用链接和嵌入]
[词汇表]


13

完整的holyswift故事

这里输入图片描述

更多详情


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接