我有一个包含另一个项目的项目的问题。第二个项目是主项目所需的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)
然后,按照链接的屏幕截图:Screenshot,在目标的构建阶段,将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)
在目标的构建阶段,从编译源代码中删除非官方Twitter SDK框架使用的OAUTH库的实现文件可以消除这些错误,并且项目归档构建成功。
当我尝试构建用于调试的项目时,我得到了与这些错误相反的错误,首先是未定义OAUTH库符号。将它们添加到编译源可以解决这个问题,然后会复制SBJSON符号。从编译源中删除它们可以使调试构建成功完成。
有没有人知道有一种方法可以让它们和谐共存,这样我就可以同时进行项目的调试和归档构建,而不需要每次都修改这个文件?
发布于 2012-09-27 11:04:01
Twitter和Facebook库都针对相同的SBJSON框架进行链接。从代码构建这两个库,而不是使用静态库。执行此操作时,从其中一个SDK中删除SBJSON引用。
这是我讨厌基于静态库进行构建的另一个原因。如果你没有源代码,库的创建者没有给他的类/方法加前缀,那么这个问题将是无法解决的。
或者,您可以使用最新发布的Facebook SDK版本3.1,其中最终将SBJSON作为FBSBJSON的前缀。
https://stackoverflow.com/questions/12611410
复制相似问题