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


87

使用外部框架时,Xcode现在具有“嵌入式二进制文件”和“链接框架”部分。

在此处输入图片说明

当您下载一个外部框架并将Finder->拖入Xcode时,它将把该框架放入“链接的框架和库”部分。

使用Carthage构建库时,建议将其拖入“嵌入式二进制文件”部分。

两者似乎都在链接方面起作用,因为无论哪种方式都可以使用API​​,在将框架添加到“嵌入式二进制文件”部分时更是如此,它还会自动添加到“链接框架和库”部分中。

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


当您在设备上进行测试时,它可以工作吗?
trojanfoe 2015年

@trojanfoe是的。
Maxim Veksler 2015年

除非是1)嵌入式二进制文件部分中的2)具有构建步骤以在构建过程中将框架复制到应用程序包中,否则这没有任何意义。
trojanfoe 2015年

2
迦太基建议仅对OSX应用程序拖入“嵌入式二进制文件”。对于iOS,他们建议仅使用“链接的框架和库”。
Damnum

Answers:


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

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


1
“需要时”部分是什么意思?这是否意味着在运行时需要嵌入式框架时就将其加载?此外,您认为什么时候会为动态框架进行链接?
bartosss

是否有我们需要的情况embed,不是link吗?反之亦然?又为什么呢
allenlinli

我认为您只需要链接直接在代码中使用其API的框架,如果我正确的话,应该只嵌入应用程序代码中未引用的可传递依赖项。
Werner Altewischer

15

如果嵌入二进制文件,它将包含在您的产品中。如果仅链接库或框架而不嵌入它,则它将不属于您的产品。

但是,在iOS8中,所有“第三方”框架都需要“嵌入”。甚至各个程序之间共享的框架也都需要“嵌入”到这些程序的每个单独程序中。如果将其安装在共享位置的设备上,则使用来自共享位置的相同“嵌入式”代码的任何其他安装过程都可以重新使用该现有安装。这是特定于iOS8的,在iOS8之前以及在iOS世界之外,这是不可能的。


2
“在用户尚未在其计算机上有效安装该文件的情况下,将其嵌入二进制文件将使用户更容易安装产品”,听起来像OSX,而​​不是iOS ...如果他们没有该库安装(即非标准),则该应用将无法加载。
trojanfoe 2015年

它不仅不会加载,@ trojanfoe,还会被拒绝,并且您无法首先安装它(除非您是开发人员或使用企业帐户...)
dogsgod 2015年

从iOS 8
Basti 2015年

当用户安装您的应用程序并且该应用程序包含动态链接的框架时,可以自动搜索该框架。但是,这是一个附加点,在用户的安装过程中可能会失败,从而引发链接编辑错误,该错误将终止应用程序。因此,我认为没有理由将答案仅适用于OS X而不适用于iOS。如果您发现我的答案仍有改进的余地,请更具体。或者,如果您认为答案已经是正确的,则可以将该答案投票以使其他开发人员成为正式的SO成员;)
Basti 2015年

这是我反对您回答的可选方面。如果框架是第三方,则它必须是应用程序捆绑包的一部分。期。OSX应用程序也是如此(对于通过Mac App Store分发的应用程序当然也是如此)。
trojanfoe 2015年

0

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

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

在这里阅读更多


-3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.