Class 在两者中都实现了。将使用两者之一

Class is implemented in both. One of the two will be used

我有一个项目有一个使用 SocketRocket 的依赖项(通过 CocoaPods 安装),并且从 HeapAnalytics 导入了一个静态库。显然 HeapAnalytics 库已经使用了 SocketRocket。编译时没有出现错误,但在运行时收到以下信息:

Class SRWebSocket is implemented in both [path] and [path].
One of the two will be used. Which one is undefined.

我不确定如何处理它,因为我见过的大多数解决方案都需要自己编译静态库,更改 class 名称等,而我无法访问源代码。

有什么建议吗?

我写了那个错误信息!•

要么更改 class 名称,要么不要 link 反对所述库。

您的项目是如何配置的?有没有什么地方你明确link反对SR?或者它是 linking 针对两个都已经包含 SR 的静态库的产物?

如果是前者,则停止 link 直接针对 SR 并仅继承已使用它的库随附的版本(警告:确保它具有正确的版本)。

如果是后者,那么您将不得不修改其中一个库。

• 其实我修改了错误。它曾经暗示将使用一个或另一个。但这并不是真正发生的事情,不同平台的行为也不同。因此,对其进行了更改,以便更准确地识别未定义的行为。

在我的例子中,当我不必要地将源文件添加到我的主应用程序目标和我的测试目标时,出现了这个错误:

Target Membership 中删除测试目标解决了它:

概览:

错误提示同一个符号/class被定义了两次

解决方案:

  • 检查链接的框架,看是否有任何重复。如果是这样,请删除重复项
  • 清理构建文件夹(Command + Shift + K)
  • 如果是模拟器,那么重置模拟器试试
  • 如果是设备,重启设备试试

我的经验:

我两次遇到同样的问题,一次是重复的框架,另一次重置模拟器有帮助。

我有一个多月的警告,然后我终于尝试了这个并且对我有用:

  1. 重置 模拟器(菜单:硬件 -> 清除所有内容和设置...)
  2. 清理 项目(Command + Shift + K)
  3. 清理 构建文件夹(Command + Option + Shift + K)
  4. 运行再模拟器上代码