1

我对包含另一个项目的项目有疑问。第二个项目是主项目所需的 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 库的实现文件添加到目标的构建阶段中的编译源中:

这会产生一个不同的问题,如下所示:

    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)

从目标的 Build Phases 中的 Compile Sources 中删除 Unofficial Twitter SDK 框架使用的 OAUTH 库的实现文件会删除这些错误,并且项目存档构建成功。

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

有谁知道一种让这些和谐共存的方法,这样我就可以同时调试和归档项目构建,而无需每次都处理这个文件?

4

1 回答 1

0

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

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

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

于 2012-09-27T11:04:00.720 回答