【问题标题】:Duplicate symbol _OBJC_METACLASS_$_SBJsonParser重复符号_OBJC_METACLASS_$_SBJsonParser
【发布时间】:2012-07-16 05:16:16
【问题描述】:

我刚刚将 AWSIOSSDK.framework 和 Facebook SDK 一起包含在我的项目中,然后出现构建错误:

ld:重复符号 _OBJC_METACLASS_$_SBJsonParser 在 /Users/tom8/Desktop/site1/site1/facebook-ios-sdk/libfacebook_ios_sdk.a(SBJsonParser.o) 和 /Users/tom8/Desktop/AWSiOSSDK.framework/AWSiOSSDK( SBJsonParser.o) 用于架构 i386

我使用 iOS Facebook SDK 静态库,所以我不能简单地删除 facebooksdk 文件夹中的 sbjson 文件。我还尝试删除 AWSIOSSDK 文件夹中的 sbjson 文件,但它也不起作用。有人能给我一些建议吗?

【问题讨论】:

  • 项目中两次获取 SBJsonParser 文件。您需要删除其中一个文件引用。来自 AWSIOSSDK 或来自 Facebook。
  • 这个我知道,但问题是如何删除它。

标签: iphone ios facebook


【解决方案1】:

几乎无一例外,当我得到重复的符号构建错误时,这是​​因为我从其他 .h 文件中#include-ing .h 文件过多。解决方案几乎总是这两个简单的步骤:

  1. 将尽可能多的#include 指令移动到 .m 文件中
  2. 在 .h 文件中使用 @protocol 和 @class 前向声明。

需要从.h 中#include .h 的情况是您实际扩展一个类或实现一个协议。如果您只需要在签名中使用类名或协议名,请使用前向声明并将#include 移动到 .m 文件中。

示例:

foo.h

#include "Bar.h"
#include "BazProtocol.h"
#include "BarDelegateProtocol.h"
@interface Foo:NSObject <BarDelegate>
@property (strong, nonatomic) id<Baz> myBaz;
@property (strong, nonatomic) Bar *myBar;
@end

变成

#include "BarDelegateProtocol.h"
@class Bar;
@protocol Baz;

@interface Foo:NSObject
@property (strong, nonatomic) id<Baz> myBaz;
@property (strong, nonatomic) Bar *myBar;
@end

【讨论】:

  • 您所描述的当然是一个好主意,但它对重复符号 linker 错误没有帮助。您还应该使用#import 而不是#include 来防止将相同的标头多次包含到同一个编译单元中,这会产生重复的符号编译器错误。
【解决方案2】:

我也有同样的问题。您可以从 Facebook 项目本身删除文件,但不能从框架中删除。

所以点击:

facebook-ios-sdk.xcodeproj(打开文件内容)-> FBConnect(查看文件夹内容)-> JSON(查看文件夹内容)-> 删除 SBJsonWriter 和 SBJsonParser。

尝试编译。你应该很高兴!

伊娃

【讨论】:

    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 2019-01-26
    • 2020-10-20
    • 2016-02-03
    相关资源
    最近更新 更多