【问题标题】:Use two versions of the same library使用同一个库的两个版本
【发布时间】:2013-12-18 16:42:12
【问题描述】:

我在一个 iOS 项目中工作,其中包含由另一家公司创建的静态库。 该库包含旧版本的 AFNeworking,我没有任何源文件。

现在我需要使用更新(且错误更少)版本的 afneworking,但我不能在项目中两次包含同一类(当然),因为所有“重复符号”。

我知道替换库中包含的版本是不可能的,但是如何在旧版本中包含另一个版本?

在包含在我的项目中之前,有一种(简单的)方法可以重构整个框架吗?

谢谢

【问题讨论】:

  • 嘿...你是怎么解决这个问题的??我有同样的问题..请指导我
  • 很抱歉,在尝试了一些木马解决方案后(它有效,但有点危险且非常棘手)我要求我的老板索取原始源代码

标签: ios xcode afnetworking


【解决方案1】:

您必须重新打包静态库以删除嵌入的 AFNetworking 文件。

解压库:

$ ar x libwhatever.a

并重新打包,包括除 AFNetworking 对象文件之外的所有文件:

$ ar cr libwhatever.a file1.o ... fileN.o

然后,您必须将您的可执行文件与新的 AFNetworking 静态库链接,并希望没有 API 更改会破坏 libwhatever.a 中的代码。如果有,那么我怀疑你可以做很多事情。

【讨论】:

  • 可能有效,但它取决于 ABI 在编译时链接的版本和您现在链接的版本之间不会发生变化。如果您的移动超过一个点版本,我不希望这会起作用。
  • @MichaelMelanson ABI 改变了吗?这种情况永远不会改变。
  • 这似乎很危险,而且很容易做出改变来打破这种局面。
  • 是的 - 我提到了。不过值得一试。
  • 不确定你的意思。我指的是应用程序二进制接口,即使 API 没有改变,它也肯定可以在库的两个版本之间改变。例如,如果新版本引入、删除或重新排列 ivars,那么访问或修改类中任何 ivar 的所有代码都可能被破坏。
【解决方案2】:

恐怕这并不容易。很少有环境允许您同时链接同一框架的两个不同版本,Xcode / iOS 不是其中之一。

在我看来,你有三个选择:

1) 链接到他们的库并使用他们使用的相同版本的 AFNetworking。

2) 链接到他们的库,并手动加载较新版本的 AFNetworking 并从中提取符号。请注意:这会很快变得丑陋,未来的维护者会想知道你在抽什么。

3) 让他们更新他们的库。

顺便说一句,我不知道这里的情况,但总的来说,他们应该为您提供资源。仅提供静态(静态!)库并且无法知道它在内部做什么是一种非常落后的做法。您必须签署软件许可协议等以保护他们的利益。

【讨论】:

    【解决方案3】:

    最好和最恰当的处理方式是联系静态库的创建者并让他们解决问题。他们可以通过更新 AFNetworking 的嵌入式版本、消除对 AFNetworking 的依赖或为其嵌入式 AFNetworking 副本添加前缀来解决此问题。无论如何,当第三方库嵌入不同的库时,最后一个可能是个好主意,因为否则不可能同时使用两个包含相同第三方库的库。

    您还可以重构您自己包含的 AFNetworking 副本,以将类的名称更改为具有前缀,尽管这应该是不必要的,因为静态库供应商应该自己已经这样做了。

    最后,您可以找到一个不同的库,它与您当前的库完成相同的事情,但没有嵌入 AFNetworking。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 2016-04-03
      • 1970-01-01
      • 2019-11-18
      • 2012-08-02
      • 2014-12-11
      • 1970-01-01
      相关资源
      最近更新 更多