重复符号错误:SBJsonParser.o?

Posted

技术标签:

【中文标题】重复符号错误:SBJsonParser.o?【英文标题】:Duplicate Symbol Error: SBJsonParser.o? 【发布时间】:2012-07-21 03:48:38 【问题描述】:

我的项目中目前有 ShareKit,它被编译为静态库。它得到了适当的实施。我还通过将亚马逊的框架添加到我的项目中来实现了亚马逊的 AWS 开发工具包。

似乎重复的符号来自亚马逊的 AWS 开发工具包文件“AWSiosSDK”。这是它的样子:

该文件与 ShareKit 的文件 libShareKit.a 发生冲突。这是该文件的样子:

无论如何,这两个文件都是我以前从未见过的。似乎一些 JSON 文件在其中发生冲突。

我查看了其他 SO 问题,他们说要对已编译的源代码做一些事情,但这些文件都不是来自任一库的已编译源代码。

这是 Xcode 给出的确切错误:

ld: duplicate symbol _OBJC_CLASS_$_SBJsonParser

无论如何,有人知道我应该怎么做吗?除非我解决此问题,否则我的应用无法编译。

谢谢!

【问题讨论】:

重复符号错误与头文件无关。 看看我更新的问题,我的一些信息是错误的。 图片什么都没有显示——而且json文件不会与符号冲突——我认为你需要让你的问题更清楚 把这个从我的脑海里拉出来......你的构建设置标志中有-obj-c标志吗? 是的,我愿意@JamesWebster。我现在将图像直接添加到问题中标记。我还添加了 Xcode 给出的错误。 【参考方案1】:

我的 FaceBookConnect 框架(我们称之为项目 B)和我的项目(项目 A)有同样的问题。两者都再次链接 JSON 框架。

解决办法是:

    转到项目 B > 目标 > 构建阶段 > 从“Link Binary with libraries”中删除 JSON 确保 JSON 框架仍在项目中(不要删除它),以便项目 B 可以构建 构建您的项目 B 应该不会出现任何错误。该项目应构建但不嵌入 JSON 框架符号 在项目 A 中同时添加项目 B 产品(一个框架)和 JSON 框架 转到项目 A > 目标 > 构建阶段并检查项目 B 和 JSON 是否已添加到“将二进制文件与库链接”部分 构建您的项目 A

问候,

【讨论】:

【参考方案2】:

您可以继续将库存档拆分为其目标文件,然后通过删除重复项再次合并它们。

请参阅以下演练以获得管理该任务的想法: Avoiding duplicate symbol errors during linking by removing classes from static libraries

【讨论】:

【参考方案3】:

它们都将SBJsonParser 构建到它们的静态库中。这不是构建静态库的正确方法。每个都应该在没有SBJson 的情况下构建,然后你应该将它们与SBJson 链接在一起。有几个解决方案:

重建这些库(或让他们的维护者这样做)以不将第三方库直接包含到静态库中。这是理想的解决方案。 使用ar.a 文件中删除不正确的SBJson 文件。您应该可以使用ar -t 列出.a 中的对象,然后使用ar -d 删除不应该在其中的对象。您当然也可以ar -x 提取所有.o 文件并直接链接它们。

【讨论】:

+1 用于大声拼写:不要在您的库中包含其他库,但告诉用户链接它们。 我可能会选择第二种解决方案。问题是,AWSIOSSDK 文件不是 .a 文件吗?所以我只从 ShareKit 的 .a 文件或 AWSIOSSDK 文件中删除 SBJSON 文件?那么每个库应该在哪里查找 SBJSON 文件? AWSIOSSDK 不是.a 文件是什么意思?我从来没有使用过它,但它还能是什么?您无法在 iOS 上发布第三方共享库。当它们是静态库时,“每个库”不会出现在任何地方。静态库只是一组未链接的 .o 文件。这与将相关的.m 文件拖放到您的项目中相同。整个程序只需要解析每个符号;没有人关心符号是从哪里解析的。 没关系,我只是糊涂了。您能否指出一个链接,该链接与您在第二个项目符号中解释的内容一样,还是我应该按照@Till 的链接? Till 的链接看起来是一个非常好的教程。这与我正在讨论的方法基本相同,尽管它还包含一些关于如何使用 lipo 处理通用库的出色说明(我没有介绍)。

以上是关于重复符号错误:SBJsonParser.o?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode中的重复符号错误

为啥 XCode 会抛出重复的符号错误?

重复符号错误

错误:找不到符号(dataOutputStream out)[重复]

R.id 给出错误“无法解析符号'R'”[重复]

错误:找不到符号方法 setContentView(int) [重复]