如何处理来自第三方库的重复符号错误?

时间:2010-05-26 05:13:08

标签: iphone objective-c cocoa-touch xcode

我有两个第三方库似乎使用相同的类。这应该没问题,但我在构建时遇到了这种错误:

ld: duplicate symbol .objc_class_name_CJSONScanner in /Users/myappOne/TapjoyConnect/Frameworks/libTapjoyConnectSimulatorRewardInstall_Ads_Pinch.a(CJSONScanner.o) and /Developer/Projects/BuildOutput/Debug-iphonesimulator/OtherLibrary_d.a(CJSONScanner.o)

我该如何处理这个问题...

- 编辑 -

...如果源文件不可用?

3 个答案:

答案 0 :(得分:31)

我将假设这两个第三方库只提供了.a文件,而不是源代码。您可以在终端上使用libtool,lipo和ar来提取和重新组合文件。

要查看文件中的架构:

$ lipo -info libTapjoy.a
Architectures in the fat file: libTapjoy.a are: armv6 i386

然后只提取armv6,例如:

$ lipo -extract_family armv6 -output libTapjoy-armv6.a libTapjoy.a
$ mkdir armv6
$ cd armv6
$ ar -x ../libTapjoy-armv6.a

然后,您可以将相同的体系结构从其他库中提取到同一目录中,然后重新组合它们:

$ libtool -static -o ../lib-armv6.a *.o

然后最后,在你完成每个架构之后,你可以再次将它们与lipo结合起来:

$ cd ..
$ lipo -create -output lib.a lib-armv6.a lib-i386.a

这应该删除任何重复的符号,但也将两个库合并为一个。如果要将它们分开,或者只是从一个库中删除副本,则可以相应地修改该过程。

答案 1 :(得分:1)

Cory Kilger的答案是正确的方法......只是一个小小的调整,因为我没有评论的声誉。

在我的Mac OS 10.8系统上,这个lipo命令是我用来制作用于ar的.a文件的命令:

lipo -thin armv6 -output libTapjoy-armv6.a libTabjoy.a

lipo的手册页说-extract和-extract_family都生成通用的.a文件,我的ar命令不会从中提取任何内容。

答案 2 :(得分:0)

如果您拥有两个静态库的源代码,请在没有CJSONScanner类的情况下构建其中一个静态库。如果不这样做,可以使用命令行中的“ar”从其中一个库中提取CJSONScanner.o。

可能会有一些神奇的旗帜可以传递给“ld”来解决这个问题,但我手边还不知道。