3

从这里交叉发布,来自我在 github 项目jverkoey/iOS-Framework上创建的问题。在为 iOS 制作一个不错的 .framework 以分发给第三方方面,这似乎让你完成了 90% 的工作。

但是,如果您在 .framework 中分发其他第三方 SDK 怎么办?有没有办法将这些其他第三方 SDK 拥有的 .a、.framework 和其他 .dylib 文件直接包含到您的 .framework 中?

是否可以让您创建的框架包装其他第三方框架,如本项目中所述,可能具有以下内容:

  • .a 文件
  • 其他 .framework 文件
  • 其他 .dylib 文件

因此,使用您的框架的开发人员不必从您的框架包装的第三方库中手动添加 .a、.framework 和 .dylib 文件?

我很想知道为什么这对于每个文件都是不可能的,如果是这样的话。


资源:

(通过https://github.com/jverkoey/iOS-Framework/issues/67

4

2 回答 2

3

我会说不建议嵌入其他框架/库。它可能会导致问题,并且会使框架膨胀。看看 Apple 做了什么,当你需要一个库/框架时,你可以添加它。

当您发布一个框架时,只需说明(网站/自述文件/github)它所依赖的内容(即 CoreLocation.framework、CoreGraphics.framework 等)。如果是开源的,您可能需要说明您的框架使用的特定版本。

我对具有嵌入式源代码依赖项的 3rd 方库/框架感到头疼(亚马逊导致我的应用程序无法使用他们的iOS AWS SDK和 SBJSON 内部依赖项构建)。

注意如果您在构建中包含第三方源代码,则需要确保重命名所有代码文件(即 SourceFile.h > PSSourceFile.h 等)。否则,如果他们的项目中已经有源代码,人们将无法集成您的 .framework。他们会得到重复的符号,他们唯一的解决方案是:不使用您的框架或重命名他们的文件以防止重复符号(在他们解决问题之前,我必须手动重命名 IOS AWS SDK 中的大量文件)。

于 2013-11-14T06:21:23.627 回答
3

首先,iOS 不支持创建动态库。iOS 可以使用的唯一动态库是那些已经包含在 iOS 项目代码中的动态库。这是由于 iOS 如何处理动态库并允许它们在应用程序之间共享的本质。由于您链接的库不应在应用程序之间共享,因此它们对此进行了限制。

这给我们留下了静态库。在 iOS 中有两种方法可以打包静态库。第一种是创建 .a 并设置标题。另一种是创建一个 .framework 包,该包仅以系统易于处理的格式组织静态存档和标题。

考虑到这一点,静态库只是 .a 存档中已编译的源对象 .o 文件的集合。这些尚未链接,并且尚未为它们创建符号。据我了解,这就是为什么标头位置很重要,尤其是哪些标头是公共的、受保护的和私有的。

您可能不想将静态库捆绑到另一个静态库中是有原因的。如果您有两个库都包含一个依赖静态库,那么您将遇到可能导致很多问题的冲突。您发布的第三个链接谈到了这一点。

现在,如果您不关心两个库都包含相同的静态库依赖项将会出现的问题,那么您可以通过将两个库组合在一起来解决这个问题。我没有对此进行测试,但我相信你可以通过多种方式做到这一点。我会在测试后修改这篇文章。工具将是:

libtool最终只会将两者结合在一起

lipo结合了两个静态库(主要用于创建特定于架构的胖二进制文件)

ar您将使用它从两个 .a 档案中 e(x) 提取 .o 文件,然后将它们一起存档到一个二进制文件中。

您需要在您的标题搜索路径中包含这两个档案的标题,以便在您的项目之外获得对它们的公共访问权限,而且我不是 100% 了解您的框架如何使用对这些连接库的依赖项进行编译,但我我正在创建一个测试项目来查看。

除此之外,包括另一个库的源代码并将其构建到您的库中而不是其自己的单独库中也是一种解决方法。

于 2013-11-14T06:34:03.497 回答