嵌入式二进制文件和链接框架有啥区别

Posted

技术标签:

【中文标题】嵌入式二进制文件和链接框架有啥区别【英文标题】:What is the difference between Embedded Binaries and Linked Frameworks嵌入式二进制文件和链接框架有什么区别 【发布时间】:2015-11-29 07:00:12 【问题描述】:

当使用外部框架时,Xcode 现在有 Embedded Binaries 以及 Linked Frameworks 部分。

当您下载外部框架并将其 Finder->拖到 Xcode 中时,它会将框架放入 Linked Frameworks and Libraries 部分。

当您使用 Carthage 构建库时,建议将其拖入 Embedded Binaries 部分。

两者似乎都在链接方面工作,因为 API 变得可用,此外,当将框架添加到 Embedded Binaries 部分时,它也会自动添加到 链接的框架和库部分。

那么,谁是对的?迦太基还是互联网的其余部分?为什么有 2 个选项可以将外部资源包含到 Xcode 项目中?

【问题讨论】:

在设备上测试时它是否有效? @***foe 是的。 这没有意义,除非它是 1) 在嵌入式二进制文件部分中或 2) 在构建过程中具有将框架复制到应用程序包中的构建步骤。 Carthage 建议仅将 OSX 应用程序拖入“嵌入式二进制文件”。对于 ios,他们只推荐“链接框架和库”。 Link Binary with libraries VS Embed Frameworks的可能重复 【参考方案1】:

如果您嵌入二进制文件,它将包含在您的产品中。如果您只链接一个库或框架而不嵌入它,它就不会成为您产品的一部分。

但是,在 iOS8 中,所有 3rd 方框架都需要“嵌入”。即使是在不同程序之间共享的框架也需要“嵌入”到每个程序中。如果它安装在共享位置的设备上,则任何其他使用来自共享位置的相同“嵌入”代码的安装过程都可以重新使用该现有安装。这是 iOS8 特有的,在 iOS8 之前和 iOS 世界之外,这个答案是不可能的。

【讨论】:

“嵌入二进制文件将使用户更容易为用户安装您的产品,以防他们尚未在他们的机器上安装这些东西”听起来像 OSX,而​​不是 iOS...如果他们没有安装库(即它是非标准的),那么应用程序根本不会加载。 它不仅不会加载,@***foe,它还会被拒绝,而且您一开始就无法安装它(除非您是开发人员或使用企业帐户...) 自 iOS 8 起动态链接框架成为可能 当用户安装您的应用时,如果该应用包含动态链接的框架,则可以自动搜索该框架。但是,这是一个附加点,在用户安装过程中可能会失败,从而引发链接编辑错误,从而终止应用程序。所以我看不出答案只适用于 OS X 而不适用于 iOS 的理由。如果您认为我的回答有改进的余地,请更具体。或者,如果您认为答案已经准确,请对该答案进行投票,以使其他开发人员成为完整的 SO 成员;) 这是我反对的答案的可选方面。如果框架是第 3 方,那么它必须是应用程序包的一部分。时期。这在很大程度上也适用于 OSX 应用程序(当然对于通过 Mac App Store 分发的应用程序)。【参考方案2】:

    链接 - 如果我们使用框架中定义的任何 API,我们必须链接框架。

    嵌入 - 此过程将确保添加的框架嵌入到应用程序包中,并可能有助于在应用程序和任何扩展包之间共享代码。我们只嵌入了第三方框架,而不是 iOS 提供的那些,因为它们在设备中很容易使用。如果我们正在嵌入,这意味着我们也需要链接到它们,以便 Xcode 可以编译和创建构建。当应用在设备中运行时,嵌入式框架会在需要时加载到内存中。

【讨论】:

“当需要时”部分是什么意思?这是否意味着在运行时需要时加载嵌入式框架?另外,您认为动态框架的链接何时会发生? 有没有我们需要embed而不是link的情况?反之亦然?为什么? 我认为您只需要链接您直接在代码中使用其 API 的框架,如果我是正确的,应该嵌入应用程序代码中未引用的传递依赖项。【参考方案3】:

据我了解,嵌入式二进制文件只包含 iOS 8 及更高版本可用的动态框架,否则只能链接静态框架。

【讨论】:

【参考方案4】:

Linking 更多关于Linker 在编译时或加载/运行时工作。 Linker 复制 Library 到目标二进制文件中。由于Framework 是自治的,在这种情况下,Linker 负责在系统加载程序路径 内查找和链接Dynamic Framework,或者在bundle。

Embedding 是将二进制文件复制到目标二进制文件的过程。因此,它将位于内部。

阅读更多here

【讨论】:

【参考方案5】:

链接- 如果我们使用其中定义的任何 API,我们必须链接框架。

嵌入 - 此过程将确保添加的框架将 嵌入在 App 包中,并可能有助于共享代码 在应用程序和任何扩展包之间。我们只嵌入第三方 框架,而不是 iOS 提供的框架,因为它们很容易 设备中可用。如果我们嵌入,这意味着,我们将 也需要链接到它们,以便 Xcode 可以编译和创建 建造。当应用程序在设备中运行时,嵌入式框架 将在需要时加载到内存中

.

【讨论】:

以上是关于嵌入式二进制文件和链接框架有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

我们啥时候应该在 Xcode 中使用“嵌入式二进制文件”而不是“链接框架”?

符号链接和硬链接有啥区别?

请问啥是二进制文件 啥是ASCII 啥是文本文件 它们之间有啥区别

C中文件操作的文本模式和二进制模式,到底有啥区别?

XIB 和 NIB 文件有啥区别?

什么是Xcode中的嵌入式二进制文件?