2012-12-11 44 views
7

我正在开发一个依赖两个静态实用程序库(libBFSDK & libBetfair-Platform)的iPad应用程序。这两个静态库都包含AFNetworking。当我尝试包括在我的iPad应用程序中的两个静态库,我得到一个链接错误,如:Xcode多个静态库和重复符号

duplicate symbol _OBJC_METACLASS_$_AFImageCache in: 
/Users/osheas/Library/Developer/Xcode/DerivedData/Betfair-gnnjnwtovdmtoxakuxbjyvetciyy/Build/Products/Debug-iphonesimulator/libBFSDK.a(UIImageView+AFNetworking.o) 
/Users/osheas/Library/Developer/Xcode/DerivedData/Betfair-gnnjnwtovdmtoxakuxbjyvetciyy/Build/Products/Debug-iphonesimulator/libBetfair-Platform.a(UIImageView+AFNetworking.o) 
ld: 86 duplicate symbols for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

的UIImageView + AFNetworking是AFNetworking的一部分。这两个静态库都包含AFNetworking。结果,我得到了UIImageView + AFNetworking的重复符号。

任何人对此有解决方法的想法?我可以访问两个静态库的源代码,但我仍然不确定如何解决这个问题。

感谢&请让我知道如果你需要任何其他细节,

肖恩

PS - FWIW我跑的Xcode 4.5 &我需要能够部署到iOS 4.x的设备。

+0

当然,答案是只导入子项目中的标题?链接到静态库只能在iPad应用程序中完成? –

回答

-1

你检查_AFImageCache在你的项目中有两个文件,并删除一个。

这可以帮助你。

+0

我假设你的意思是UIImageView + AFNetworking而不是AFImageCache?在应用程序中有两个版本的UIImageView + AFNetworking。每个静态库包括AFNetworking,其中包括UIImageView + AFNetworking。我会更新这个问题以确保这个更清楚。 – seanoshea

3

由于您有权访问静态库的源代码,因此可以使用预处理器将AFNetworking符号重命名为唯一的东西。

每个副本符号添加标志到“其他C标志”建立一个与格式

-AFNetworkingSymbol=UniqueAFNetworkingSymbol

这仍然会导致重复的代码设置,但应该让你有AFNetworking的多个副本,而不修改源文件。

More info

理想的情况下,大多数开源的OBJ-C代码将移动到喜欢的CocoaPods的解决方案,只是指定的依赖,而不是捆绑他们。

+0

好点。我在过去的一个月左右一直在使用CocoaPods,并发现它对于找出库之间的依赖关系非常有用。 – seanoshea

+0

我正在寻找一种方法来执行此操作,以在我输出的SDK中为所有符号执行此操作,而不必在每次添加新文件时都添加一个新标志,以便我们确保永远不会存在命名冲突。 –

+0

你应该在每个语句前加上-D -DAFN .... – gubble