静态库依赖关系的最佳实践

我正在写一个静态库依赖于其他库(在我的情况SBJSON和ASIHTTPRequest)。

如果我将这些外部依赖关系编译到我的库中,那么我不能链接到其他编译了这些类的库。因为我的目标是为我的公司创build一组可以导入到任何新应用程序的静态库,编译这些依赖到图书馆显然不是一个select。

有没有人有任何build议/最佳做法来创build一套共同的依赖关系共享静态库?

您可以使用像CocoaPods或VendorKit这样的依赖pipe理器来引入所需的库以及所有它的传递依赖 – 库所依赖的库。

依赖关系pipe理器的任务是pipe理传递依赖中的任何冲突 – 例如,如果两个库都使用不同版本的SBJSON,那么它将解决做什么。 所有你需要做的是在configuration文件中声明你想要的顶层库,它将确定需要哪些子库并将它们拖到你的Xcode项目中。

CocaoPods有一个很好的方法来pipe理这个,把所有的库作为源代码,然后把它们编译成一个静态库 – 在一个单独的项目中。 然后通过工作区将其链接到您的项目中。

VendorKit采用类似的方法,但使用单个项目文件。

CocoaPods和VendorKit都允许您轻松地将您的库发布到中央存储库。 如果您愿意,CocaoPods允许您维护自己的中央仓库的私人或公共分支,即作为企业存储库。

大多数时候这会让你摆脱困境。 在极less数情况下,您的图书馆可能依赖于另一个通用图书馆的特定的旧版本。 在这种情况下,您可以使用工具重命名该库中的所有头文件/ impl文件以避免冲突。

[编辑]:截至2013年1月,还有一个新的竞争者 – Maven Xcode插件。

静态库只是一个对象文件的集合。 在你的情况下,你不希望SBJSON和ASIHTTPRequest的对象文件被包含在你的静态库中 – 你想把这个工作留给最终的应用程序。 你的静态库唯一需要的是SBJSON和ASIHTTPRequest的头文件。

由于这些项目都是作为源文件(.h和.m文件)分发的,因此您只需告诉Xcode不要为您的静态库目标构buildSBJSON / ASIHTTPRequest .m文件。

最简单的方法是只将这些项目的.h头文件导入到Xcode项目中。 或者,您可以导入.h和.m文件,但要确保.m文件不包含在静态库目标的“编译源”构build阶段

一些其他相关的SO主题:

我怎样才能避免共享静态库Xcode中的“重复符号”错误?

复制符号:在静态库B中包含静态库A,在XCode项目中也包含库A和B.

为每个库创build一个静态框架 。 logging头文件中的依赖关系。

[编辑]:我现在更喜欢使用Cocoapods。 请参阅https://stackoverflow.com/a/10781087/9636