重复符号错误: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?的主要内容,如果未能解决你的问题,请参考以下文章