【问题标题】:Prefix Static Library iOS前缀静态库 iOS
【发布时间】:2012-07-15 18:31:32
【问题描述】:

我正在构建一个 iOS 静态库(根据 https://github.com/jverkoey/iOS-Framework)。我依赖于 SBJson 和 AFNetworking。我想包含这些库以避免版本问题和安装简单;为此,我需要为这些库添加前缀以避免命名冲突。

如何以简单的方式为其他静态库添加前缀?

理想情况下,这将是我构建过程的一部分。不太理想但可以接受的是有关如何以合理的方式重构和重命名的提示。

【问题讨论】:

  • 我还将使用 CocoaPods,以便他们为拥有它的人处理依赖项,但希望能够分发非 CocoaPods 框架。
  • 一句话:不要!拥有外部依赖并没有错。
  • 在我看来,很多框架都这样做是为了让安装更容易。一个例子:Dropbox 将 SBJson 重命名为 DBJson。
  • 没有简单的方法可以做到这一点。过去仔细查找和替换对我有用。

标签: ios ios-frameworks


【解决方案1】:

唯一安全的解决方案(除了根本不这样做)是在所有符号上构建任何带有前缀的依赖项。

最简单的前缀方法是经典的“查找和替换”。这很容易出错,因此最好在 .a 上加上 nm -a 并在结果中搜索任何非前缀符号。

第二种更安全的方法是使用两次编译过程。

  • 第一遍构建依赖项目并运行nm 将所有符号转储到头文件中。
  • 第二遍再次构建依赖项目,但这次将生成的前缀头文件导入预编译头文件中。必须在您从框架中的依赖项中引用符号的任何地方使用此前缀标头,以便正确引用重命名的符号。

作为参考,我们将它与Nimbus 一起使用来生成 Nimbus 前缀标头: https://github.com/jverkoey/nimbus/blob/master/scripts/generate_namespace_header

这允许您分发一个嵌入了 Nimbus 前缀版本的 .framework。

您现在可以将生成的 .a 链接到您的框架中,并在第三方开发人员不可避免地将他们自己的依赖版本链接到他们的项目时安全地避免任何链接器冲突。

【讨论】:

  • 这很棒,您的 iOS 框架存储库也是如此。如果您也可以以某种方式将其添加到该存储库中,那就太棒了。非常感谢你们!
  • 我想看一个关于这个的部分,为初学者考虑更多细节。
  • 我写了一篇文章,如果有兴趣的话,可以更详细地探讨这个话题:pdx.esri.com/blog/2013/12/13/namespacing-dependencies
  • 您的文章很棒,尽管我确实发现当您的外部依赖项是其他 .a 库时它并不完全有效。它实际上并没有将 .a 中的所有这些符号链接到您的 ext 目标中,而是试图想出一种解决方法。
  • 有关详细信息,请参阅How do I include Third-Party Libraries in my Framework? 的新常见问题解答。
猜你喜欢
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 2012-05-24
相关资源
最近更新 更多