【问题标题】:Duplicate symbols, GTMOAuth2 and Facebook SDK for IOS both using SBJSON重复符号、GTMOAuth2 和 Facebook SDK for IOS 均使用 SBJSON
【发布时间】:2011-07-08 09:16:00
【问题描述】:

我有一个应用程序,我在其中实现了 facebook 登录。我将来自 facebook sdk 的源代码直接复制到我的项目中。现在我需要添加谷歌登录。这次我添加了 GTMOAuth2 作为静态库。 (我也有这方面的来源,但我无缘无故地添加为静态库)。问题是他们都在使用 SBJson,我得到了重复的符号。 facebook sdk 中的 SBJson 似乎比 GTMOAuth2 库中的更新。我是菜鸟,以前从来没有重复的符号,我该怎么办?是否有解决这个特定问题或解决重复符号的一般方法?我是否只删除出现两次的内容,直到它起作用,是否有一些链接器设置?谢谢。

更新 - 我尝试了什么:

将两个项目添加为静态库。

  • 我尝试从 GTMOAuth2 中删除 SBJSON.h/m 文件,结果:google 登录后 json 解析错误:

  • 我尝试从 Facebook iOS SDK 中删除 SBJSON.h/m 文件;结果:facebook登录后json解析错误。

我可以让这两个版本的 SBJSON 在我的应用程序中神奇地共存而没有重复的符号吗?我是否必须修改一个库才能使用我打算使用的 ONE SBJSON?

【问题讨论】:

    标签: iphone objective-c duplicate-symbol sbjson


    【解决方案1】:

    我正在使用来自 facebook sdk 的 SBJSON。我刚刚从 GTMOAuth2 库中删除了 SBJSON,以避免 Ishu 建议的重复符号。 下一个问题是 GTMOAuth2 尝试首先使用 SBJSONParser 并且该类没有 objectWithString:error: 方法,只有 SBJSON 有该方法。我修改了代码以使用 SBJSON 类,甚至不尝试使用 SBJSONParser,因为它不起作用。在原始版本中,SBJsonParser 先被检查,然后是 SBJSON。

    
    
    - (NSDictionary *)dictionaryWithJSONData:(NSData *)data {
        ...
        // try SBJsonParser or SBJSON
        Class jsonParseClass = NSClassFromString(@"SBJSON");
        /*
        if (!jsonParseClass) {
          jsonParseClass = NSClassFromString(@"SBJsonParser");
        }
        */
        if (jsonParseClass) {
          GTMOAuth2ParserClass *parser = [[[jsonParseClass alloc] init] autorelease];
          NSString *jsonStr = [[[NSString alloc] initWithData:data
                                                     encoding:NSUTF8StringEncoding] autorelease];
          if (jsonStr) {
            obj = [parser objectWithString:jsonStr error:&error];
    #if DEBUG
            if (error) {
              NSLog(@"%@ error %@ parsing %@", NSStringFromClass(jsonParseClass),
                    error, jsonStr);
            }
    #endif
            return obj;
          }
        }
      ...
    }
    

    更新 Here 我在 GTM-OAuth2 讨论组中问了同样的问题。这发生在我回答问题之后,但我忘了在这里更新我的答案。总之,这就是我所做的:

    • 同时使用 Facebook SDK 和 GTMOAuth2 作为静态库(可能没有必要)
    • here获取最新版本的SBJSON
    • 用这个替换 Facebook SDK 中的 SBJSON
    • 从 GTM-OAuth2 中删除 SBJSON 源(或从构建阶段删除它们)

    这将为您提供 Facebook SDK 中包含的最新 SBJSON 库。 Facebook SDK 和 GTM-OAuth2 都将使用那个。它应该可以工作。

    【讨论】:

      【解决方案2】:

      是的,删除 GTMOAuth2 库的 SBJSON(因为它是旧版本)。

      【讨论】:

      • 好吧,但我不完全确定哪一个是最新的。
      • 好的没问题,删除任何你想要的。你的工作也可以用旧的来完成。
      • 不幸的是,它似乎不起作用。它给了我一个例外NSInvalidArgumentException, reason: -[SBJsonParser objectWithString:error:]: unrecognized selector sent to instance 0x45bb1c0 我不知道到底出了什么问题,但它与 json 解析器有关,如果没有其他工作,我可以修改 oauth 库以使其与来自 facebook sdk 的 json 解析器一起工作跨度>
      • @gyozokudor 我相信这可能是因为 SBJsonParser 没有 objectWithString 方法。确保您正在构建包含此方法的正确源文件。我记得当我查看 facebook SBJson 时无法看到该方法...
      猜你喜欢
      • 2012-08-15
      • 2011-05-17
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      相关资源
      最近更新 更多