我的项目包含另一个项目存在问题。第二个项目是主项目所需的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符号。从编译源中删除它们可以使调试版本成功完成。
有没有人知道如何让这些共存并存,以便我可以同时进行项目的调试和存档构建,而不必每次都使用此文件进行处理?
答案 0 :(得分:0)
Twitter和Facebook库都链接到相同的SBJSON框架。从代码构建它们而不是使用静态库。执行此操作时,请从其中一个SDK中删除SBJSON引用。
这是我讨厌构建静态库的另一个原因。如果您没有源代码并且库制造商没有为他的类/方法添加前缀,则该问题将无法解决。
或者,您可以使用新发布的Facebook SDK 3.1版,它们最终将SBJSON作为FBSBJSON的前缀。