未定义的符号和重复的符号错误。可以构建用于调试或发布,但不能同时构建

时间:2012-09-26 22:27:11

标签: iphone objective-c xcode xcode4.5

我的项目包含另一个项目存在问题。第二个项目是主项目所需的SDK。目前,我将SDK包含在主项目中作为静态库。 SDK和主项目都包括FBConnect和非官方Twitter SDK框架。我相信我的问题是这些框架被包含在两个项目中的结果,但我一直无法找到让它们共存而没有错误的方法。

当项目构建用于调试时,它不会为存档构建,反之亦然。我可以通过执行相同的步骤每次解决问题,但我想找到一种方法来解决它,而不需要在调试和存档构建之间执行任何步骤。

当项目构建为调试而没有任何错误时,我在尝试存档构建时会得到以下内容:

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_SBJSON", referenced from:
      objc-class-ref in FBRequest.o
      objc-class-ref in libSDK.a(ApiTvDiscussView.o)
      objc-class-ref in libSDK.a(ApiWebView.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

然后根据链接的屏幕截图,将FBConnect框架使用的SBJSON库的实现文件添加到目标的Build Phases中的Compile Sources中:Screenshot

然后产生一个不同的问题,如下所示:

    duplicate symbol _OBJC_METACLASS_$_OAHMAC_SHA1SignatureProvider in:
        /Users/Alan/Library/Developer/Xcode/DerivedData/App-gpvfsbaxxbvhsddtcbgkggquyltl/Build/Intermediates/ArchiveIntermediates/App/IntermediateBuildFilesPath/App.build/Release-iphoneos/App.build/Objects-normal/armv7/OAHMAC_SHA1SignatureProvider.o
./libSDK.a(OAHMAC_SHA1SignatureProvider.o)

    .
    .
    .
    .
    .

    duplicate symbol _OBJC_CLASS_$_TwitterDialog in:
        /Users/Alan/Library/Developer/Xcode/DerivedData/App-gpvfsbaxxbvhsddtcbgkggquyltl/Build/Intermediates/ArchiveIntermediates/App/IntermediateBuildFilesPath/App.build/Release-iphoneos/App.build/Objects-normal/armv7/TwitterDialog.o
        ./libSDK.a(TwitterDialog.o)
    duplicate symbol _OBJC_METACLASS_$_TwitterDialog in:
        /Users/Alan/Library/Developer/Xcode/DerivedData/App-gpvfsbaxxbvhsddtcbgkggquyltl/Build/Intermediates/ArchiveIntermediates/App/IntermediateBuildFilesPath/App.build/Release-iphoneos/App.build/Objects-normal/armv7/TwitterDialog.o
        ./libSDK.a(TwitterDialog.o)
    ld: 43 duplicate symbols for architecture armv7
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

从目标的构建阶段中的编译源中删除非官方Twitter SDK框架使用的OAUTH库的实现文件会删除这些错误,并且项目存档构建成功。

当我尝试构建调试项目时,我得到了与这些错误相反的结果,首先是OAUTH库符号未定义。将它们添加到编译源可以解决问题,然后重复SBJSON符号。从编译源中删除它们可以使调试版本成功完成。

有没有人知道如何让这些共存并存,以便我可以同时进行项目的调试和存档构建,而不必每次都使用此文件进行处理?

1 个答案:

答案 0 :(得分:0)

Twitter和Facebook库都链接到相同的SBJSON框架。从代码构建它们而不是使用静态库。执行此操作时,请从其中一个SDK中删除SBJSON引用。

这是我讨厌构建静态库的另一个原因。如果您没有源代码并且库制造商没有为他的类/方法添加前缀,则该问题将无法解决。

或者,您可以使用新发布的Facebook SDK 3.1版,它们最终将SBJSON作为FBSBJSON的前缀。