duplicate symbol问题解决方法

最近想对工程目录的结构简单的整理一下,删除一些没用的文件及文件夹,发现其中有一个文件夹A下面套了一个名字相同的文件夹A,就想删除这个无用的文件夹层级,接下来是一系列操作:

1)复制子文件夹A到父文件夹A的同一级目录,替换原有的文件夹A;

2)Add Files to 将文件夹添加到工程中;

3)commond+r.

Build Failed!

错误提示duplicate symbol XXX in :XXX /ProjectPath/somelib.a(SBJSON.o),编译时有重复的.o文件SBJSON.o,原来是文件夹A底下包含了SBJSON相关的文件,而工程中引用的第三方静态库也包含了SBJSON,编译的时候相互冲突了,网上搜索到一个解决办法点击打开链接

1)如果是两个静态库冲突的话,可以将两个.a静态库解压,删除其中一个里面重复的.o文件,然后用lipo命令合并两个静态库;

lipo –create libA.a libB.a –output libTarget.a

2)如果是像我这样,工程文件和静态库冲突的话,报错会显示XXX.o文件,那么就在Build Phrase里面搜索这个类名(本例中是SBJSON),把显示出来的那几个 .m文件给remove掉就OK(本例中是SBJSON.m),或者在Xcode左侧,工程文件目录结构中找到.m文件,选中并将Target Membership的勾选去掉,效果一样;

3)进行2中的操作之后,说明该文件已经无用,可以删除之,是否删除请视实际情况而定.

这里,有一点需要注意,虽然冲突的.o文件是由相同名字的.m文件编译所得,但有可能被修改过.

看到这里,大家有没有留意一个奇怪的问题,调整文件夹A结构之前,运行没有问题,调整之后,编译失败,困惑了好久,以为是工程设置里面,搜索路径之类的问题,最后发现,调整之前SBJSON.m文件的Target Membership没有勾选,Add Files to一份拷贝的文件夹之后,默认选中了Target Membership.


你可能感兴趣的:(duplicate symbol问题解决方法)