我在iOS项目中工作,其中包含由另一家公司创建的静态库。 该库包含旧版AFNeworking,我没有任何源文件。
现在我需要使用更新的(并且更少的错误)版本的afneworking,但我不能在项目中包括相同的类两次(当然)因为所有“重复的符号”。
我知道更换库中包含的版本是不可能的,但是如何在旧版本中包含其他版本?
在我的项目中包含之前,有一种(简单)方法可以重构整个框架吗?
感谢
答案 0 :(得分:3)
我担心这不容易做到。很少有环境允许您同时链接同一框架的两个不同版本,而Xcode / iOS不是其中之一。
在我看来,你有三个选择:
1)链接到他们的库并使用他们使用的相同版本的AFNetworking。
2)链接到他们的库,并手动加载较新版本的AFNetworking并从中提取符号。请注意:这会很快变得难看,未来的维护人员会想知道你在吸烟。
3)让他们更新他们的图书馆。
另一方面,我不知道这里的情况,但总的来说,他们应该为你提供消息来源。这是一个非常倒退的做法,只提供一个静态(静态!)库,无法知道它在里面做了什么。您必须签署软件许可协议以及保护其利益的内容。
答案 1 :(得分:3)
您必须重新打包静态库才能删除嵌入的AFNetworking文件。
使用以下方法解压缩库:
$ ar x libwhatever.a
并重新打包,包括除AFNetworking对象文件以外的所有文件:
$ ar cr libwhatever.a file1.o ... fileN.o
然后,您必须将可执行文件与新的AFNetworking静态库链接,并希望没有API更改会破坏libwhatever.a
中的代码。如果有,那么我怀疑你能做多少。
答案 2 :(得分:2)
处理此问题的最佳和最恰当的方法是联系静态库的创建者并让他们解决问题。他们可以通过更新AFNetworking的嵌入版本,消除他们对AFNetworking的依赖,或为其嵌入式AFNetworking副本添加前缀来解决它。当第三方库嵌入不同的库时,最后一个可能是个好主意,因为否则不可能同时使用两个包含相同第三方库的库。
您还可以重构您自己包含的AFNetworking副本,以更改具有前缀的类的名称,尽管这应该是不必要的,因为静态库供应商应该已经自己完成此操作。
最后,您可以找到一个不同的库,它可以完成与当前库相同的操作,但不会嵌入AFNetworking。