2013-12-18 36 views
8

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

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

我知道这是不可能的,取代库中包含的版本,但我怎么可以包含旧版本的另一个版本?

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

谢谢

+0

嘿......你怎么解决这个问题?我有同样的问题..请指导我 –

+1

我很抱歉,但经过一些尝试与trojanfoe解决方案(它的作品,但有点危险和非常棘手)我问我的老板要求原始源代码 – TheObjCGuy

回答

3

您将不得不重新包装静态库以删除嵌入的AFNetworking文件。

解压与库:

$ ar x libwhatever.a 

,并重新包装它,包括除AFNetworking目标文件中的所有文件:

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

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

+1

这*可能工作,但它依赖于ABI在编译时链接的版本与您现在链接的版本之间没有变化。如果你的移动方式不止一个点,我不希望这样做。 –

+0

@MichaelMelanson ** ABI **变化?这改变,就像从来没有。 – trojanfoe

+1

这看起来很危险,而且可能很容易发生变化,从而导致此次突破。 – Gavin

3

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

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

1)对他们的图书馆链接,并使用AFNetworking同一版本,他们使用。

2)链接到他们的库,并手动加载更新版本的AFNetworking并从中拉出符号。被警告:这会变得很难看,未来的维护者会想知道你在吸烟。

3)让他们更新他们的图书馆。

在附注中,我不知道这里的情况,但总的来说,他们应该为您提供来源。只提供一个静态(静态!)库并且无法知道它在里面做什么是一个非常倒退的做法。您必须签署软件许可协议,而不是为了保护他们的利益。

2

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

你也可以重构你自己包含的AFNetworking的副本来改变类的名字以得到一个前缀,尽管这应该是不必要的,因为静态库供应商应该已经自己做了。

最后,你可以找到一个不同的库,它可以完成与你当前的相同的功能,但是它不会嵌入AFNetworking。

相关问题