我有两个第三方库似乎使用相同的类。这应该没问题,但我在构建时遇到了这种错误:
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 :(得分: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”来解决这个问题,但我手边还不知道。