iOS框架:当拥有其他第三方库时,可以使其变得更好



从这里交叉发布,从我在github项目jverkoey/iOS-Framework上创建的问题。它似乎让你完成了 90% 的方法,关于为 iOS 制作一个漂亮的 .framework 以分发给第三方。

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

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

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

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

我很想了解为什么对于每个文件都不可能这样做。


资源:

  • 关于 .dylib 文件的 https://stackoverflow.com/a/4733885/5716 是真的吗?
  • https://stackoverflow.com/a/8170851/5716 关于.a文件,可能吗?理智的?
  • ObjC:如何编译静态库,其中包括依赖于第三方库的可选类,关于您中的其他静态库,呃

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

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

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

我从具有

嵌入式源代码依赖项的第三方库/框架中遇到了很多麻烦(亚马逊导致我的应用程序无法使用其iOS AWS SDK 和SBJSON内部依赖项进行构建)。

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

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

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

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

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

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

libtool最终只会将两者放在一起

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

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

您需要在这两种方法的标题搜索路径中包含两个存档的标头,以便在项目之外获得对它们的公开访问,并且我不是 100% 了解您的框架如何编译这些连接的库的依赖项,但我正在创建一个测试项目以查看。

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

最新更新