2012-03-14 65 views
30

我在写一个静态库,它对其他库有依赖关系(在我的情况下是SBJSON和ASIHTTPRequest)。静态库依赖关系的最佳实践

如果我将这些外部依赖关系编译到我的库中,那么我无法链接到其他编译了这些类的库。我的目标是为我的公司创建一组静态库,这些库可以导入到任何新的应用程序,将这些依赖关系编译到库中显然不是一种选择。

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

+0

为什么不使用dinamyc库,而不是? – LuisEspinoza 2012-03-14 14:00:59

+0

好吧,这是不支持 – LuisEspinoza 2012-03-14 14:03:23

+3

(A)这对这个问题是相当无益的 - 我的问题是避免链接器重复符号。 SBJSON符号怎么样? (B)他们不会抛弃它。他们只是对此有意见。 (C)ASI是一个相当常用和真实世界测试过的库 - 我的代码几乎肯定是更多的错误。即使从你链接到的问题接受的答案有错误! – deanWombourne 2012-03-15 11:15:46

回答

9

您可以使用依赖关系管理器,如CocoaPodsVendorKit来拉入所需的库以及所有它的传递依赖项 - 库依赖的库。

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

CocaoPods通过将所有库作为源代码进行管理,然后将它们全部编译到单个静态库中 - 在一个单独的项目中进行管理。然后通过工作区将其链接到您的项目中。

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

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

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

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

13

静态库只是对象文件的集合。在你的情况下,你不希望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

+0

但是如果我的静态库使用旧版本的sbjson - 3.0.4,并且新项目使用3.1?它有相同的m文件但不同的h文件,或者一个使用ARC,一个不使用? – 2012-07-24 14:59:05

+0

这个非常简单和合适的解决方案应该是被接受的答案。感谢Ben为这个问题让我更加头疼! – thgc 2012-12-05 02:34:49