2010-05-26 77 views
14

我有两个似乎使用相同类的第三方库。这应该是罚款,但建设时,我得到这个类型的错误:如何处理来自第三方库的重复符号错误?

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) 

我该如何处理这个问题?

- 编辑 -

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

回答

0

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

可能有一些魔法标记可以传给“ld”来解决这个问题,但我不知道它是否在手边。

+0

“ar”是什么意思? – user230949 2010-05-26 05:34:21

+0

简单地说,'ar'是命令行工具的名称。如果你输入'man ar',你会看到详细的信息,包括功能描述:“创建和维护库档案”。 '-x'选项是用于提取的,但是您似乎希望用'-d'来删除。 – 2010-05-26 05:58:46

+0

这些很可能是胖文件,单靠'ar'是不够的。他还需要'lipo'和'libtool'来做到这一点。 – 2010-05-26 06:08:56

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 

然后最后,af之三,你已经这样做了,每个架构,你可以用脂再次将它们结合起来:

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

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

+0

那么,这是否意味着我的项目应该只引用lib.a而不是其他两个库文件? – user230949 2010-05-26 06:12:41

+0

如果你要完全按照我做的那样做,那么是的,你会删除其他两个文件并使用新的文件。 – 2010-05-26 17:33:20

+0

我刚刚在lib上找到了一个lib,在调用'lipo -extract_family armv6'之前,我不得不调用'lipo -remove armv7'。 – Liron 2012-06-14 13:20:13

1

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

在我的Mac OS 10.8系统,该脂命令是我用来制造使用的.a文件与AR的一个:

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

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