2017-04-19 109 views
0

我必须在我的应用程序中使用第三方框架。但是,当我包括框架项目中,我得到链接错误类似如下:iOS框架中的重复符号

duplicate symbol _SRHTTPResponseErrorKey in: 
    Shared/Libraries/XXX.framework/XXXSDK(SRWebSocket.o) 
    Shared/Libraries/YYY.framework/YYYSDK(YYYSRWebSocket.o) 

有没有解决这样的错误,而不改变框架(S)的方法吗?

回答

2

问题是框架和你的代码(或你的另一个框架)包含相同的类/框架。框架开发人员认为,将自己的框架作为另一个框架的保护伞是一个好主意 - 事实并非如此。框架不应该包含另一个框架。

BTW:这就是为什么你的ObjectiveC框架的每个类都应该有一个前缀。它降低了冲突的可能性。

有以下解决方案为您提供:

  1. 如果添加了两个相互矛盾的一类:重命名你的代码的类。也许分叉框架并更改所有类的前缀或使用3)中的技术创建包装框架。

  2. 要求开发人员删除所有外部代码并仅将其链接。此外,他/她必须记录依赖关系,以便框架的用户知道他/她必须添加哪个版本中的哪一个。你可以使用像CocoaPods/Carthage或makefile这样的依赖框架,而不是取得依赖的框架。

  3. 如果2)是不可能的,因为该框架将被其他客户使用,并且开发人员不会破坏他们的代码(通过这种方式愚蠢的原因):要求开发人员为每个类添加是不是他自己的代码“其他C标志”等记载here

+0

他们可能改名为类(参见'SRWebSocket'和问题'YYYSRWebSocket')。他们可能错过了一些常数。但是,一个遗漏的符号足以导致问题......可能只需从类中移除该符号就足够了,因为它已经包含在框架中。 – Sulthan

+0

是的,你是对的,没有看到:) – ObjectAlchemist

+0

顺便说一句,在另一个框架内包含框架的原因是为了隐藏实现,例如,如果你的cocoapod包含一个带有编译代码和框架的静态库。我相信谷歌分析正在这样做。 – Sulthan