我正在编写一个依赖于其他库的静态库(在我的例子中是SBJSON和ASIHTTPRequest)。
如果我将这些外部依赖项编译到我的库中,那么我就无法链接到编译了这些类的其他库。我的目标是为我的公司创建一组静态库,可以导入到任何库中。新应用程序,将这些依赖项编译到库中显然不是一种选择。
有没有人有任何关于创建具有公共依赖关系的共享静态库的建议/最佳实践?
答案 0 :(得分:13)
静态库只是目标文件的集合。在您的情况下,您不希望将SBJSON和ASIHTTPRequest的目标文件包含在静态库中 - 您希望将该作业保留在最终应用程序中。静态lib需要的唯一东西是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
答案 1 :(得分:9)
您可以使用依赖项管理器(如CocoaPods或VendorKit)来引入所需的库,以及它所有的传递依赖项 - 库所依赖的库。
依赖管理器的工作是管理传递依赖中的任何冲突 - 例如,如果两个库都使用不同版本的SBJSON,它将解决该怎么做。您所要做的就是在配置文件中声明您想要的顶级库,它将确定需要哪些子库并将它们引入您的Xcode项目。
CocoaPods有一个很好的方法来管理它,通过将所有库作为源,然后将它们全部编译到一个静态库中 - 在一个单独的项目中。然后通过工作区将其链接到您的项目中。
VendorKit采用类似的方法,但使用单个项目文件。
CocoaPods和VendorKit都允许您轻松地将库发布到中央存储库。如果您愿意,CocoaPods允许您维护自己的中央仓库的私有或公共分支 - 即作为企业存储库。
大多数情况下,这会让你摆脱困境。在极少数情况下,您的库可能依赖于另一个公共库的特定旧版本。在这种情况下,您可以使用工具重命名该库中的所有头/ impl文件以避免冲突。
[编辑]:截至2013年1月,还有一个新的竞争者 - Maven Xcode插件。
答案 2 :(得分:2)
Create a static framework。记录头文件中的依赖项。
[编辑]:我现在更喜欢使用Cocoapods。见https://stackoverflow.com/a/10781087/9636