静态库依赖关系的最佳实践
我在写一个静态库,它对其他库有依赖关系(在我的情况下是SBJSON和ASIHTTPRequest)。静态库依赖关系的最佳实践
如果我将这些外部依赖关系编译到我的库中,那么我无法链接到其他编译了这些类的库。我的目标是为我的公司创建一组静态库,这些库可以导入到任何新的应用程序,将这些依赖关系编译到库中显然不是一种选择。
有没有人有任何建议/最佳做法来创建一套共同的依赖关系共享静态库?
您可以使用依赖关系管理器,如CocoaPods或VendorKit来拉入所需的库以及所有它的传递依赖项 - 库依赖的库。
依赖关系管理器的任务是管理传递依赖关系中的任何冲突 - 例如,如果两个库都使用不同版本的SBJSON,它将解决做什么。你所要做的就是在配置文件中声明你想要的顶层库,并且它将确定需要哪些子库并将它们拉入你的Xcode项目中。
CocaoPods通过将所有库作为源代码进行管理,然后将它们全部编译到单个静态库中 - 在一个单独的项目中进行管理。然后通过工作区将其链接到您的项目中。
VendorKit采用类似的方法,但使用单个项目文件。
CocoaPods和VendorKit都允许您轻松地将您的库发布到*存储库。如果您愿意,CocaoPods允许您维护您自己的*回购的私人或公共分支 - 即作为企业存储库。
大多数时候这会让你摆脱困境。在极少数情况下,您的库可能依赖于另一个通用库的特定旧版本。在这种情况下,您可以使用工具重命名该库中的所有标题/ impl文件以避免冲突。
[编辑]:截至2013年1月,还有一个新的竞争者 - Maven Xcode插件。
Create a static framework对于每个库。记录头文件中的依赖关系。
[编辑]:我现在更喜欢使用Cocoapods。请参见https://*.com/a/10781087/9636
静态库只是对象文件的集合。在你的情况下,你不希望SBJSON和ASIHTTPRequest的对象文件被包含在你的静态库中 - 你想把这个工作留给最终的应用程序。你的静态库唯一需要的是SBJSON和ASIHTTPRequest的头文件。
由于这些项目都是作为源文件(.h和.m文件)分发的,您只需告诉Xcode不要为您的静态库目标构建SBJSON/ASIHTTPRequest .m文件。
最简单的方法是将这些项目的.h头文件导入到Xcode项目中。或者,您可以导入.h和.m文件,但要确保。M档不包括在“编译源”建设阶段的静态库的目标
其他一些相关的SO主题:
How can I avoid "duplicate symbol" errors in xcode with shared static libraries?
Duplicate symbol: Include static lib A in static lib B, also include lib A and B in XCode Project
但是如果我的静态库使用旧版本的sbjson - 3.0.4,并且新项目使用3.1?它有相同的m文件但不同的h文件,或者一个使用ARC,一个不使用? – 2012-07-24 14:59:05
这个非常简单和合适的解决方案应该是被接受的答案。感谢Ben为这个问题让我更加头疼! – thgc 2012-12-05 02:34:49
为什么不使用dinamyc库,而不是? – LuisEspinoza 2012-03-14 14:00:59
好吧,这是不支持 – LuisEspinoza 2012-03-14 14:03:23