一些错误集锦首页投稿(暂停使用,暂停投稿)iOS 进阶

iOS "duplicate symbol"

2017-07-14  本文已影响342人  RM_乾笙

duplicate symbol(重复,相同的文件名)是一种常见的链接错误,不像编译错误那样可以直接定位到问题的所在。但是经过这种错误提示,会潜意识的反射出是文件重复了.
通常出现的情况:

1、工程文件,同一个类文件被引入了两次。

引起这种错误的原因大概有两种:一是多人协作开发时,导致project文件合并冲突;二是同名文件不在同一目录下,添加到工程时造成重复添加。 这种一般在文件视图,用名字过滤器检查一下就发现了。

2、 Targets的Build Phase设置项里会出现重复

Targets的Build Phase设置项,查看Complie Sources这一项,看看出现问题的类是不是有重复的,如果重复,project文件冲突导致的。出现这种问题,只要删除就可以了。不过,在删除其中一个文件时,重复文件会自动全部删除,所以还需要重新添加一次

3、引入第三方库时与工程的文件重名冲突

如果我们的工程中引用了第三方的库或pod入第三方库时,而恰好第三方的库里面有一个,也会出现这种问题。如果不能修改第三方的库代码,也会出现这个错误,就需要解决。

小结:通常出现这个错误,一般都是上述情况比较容易解决,现在我们接下来就是重点要讲述的,如果使用两个静态库时,发生“duplicate symbol”这个冲突错误时,改如何解决。

解决两个三方库之间的问题

今天在写自己一个直播项目过程中遇到用Pod集成了LFLiveKit,但不知道为何突然出错,然后才发现因为我的项目中使用了GPUImage,因为LFLiveKit这个开源库也是有集成GPUImage,所以这就造成了冲突,产生了duplicate symbol错误。 我首先尝试删了GPUImage,但是不行,因为项目中开发中,很多地方使用了GPUImage。 后来在网上找到了解决方法,那就是把第三方库中的GPUImage.o删掉。

1、查看库所包含的CPU架构
打开终端输入如下命令: 
第一步: cd /Users/Zhang/Desktop/temp    (自己工程的目录)
第二部: lipo -info temp.a 
输出结果: Architectures in the fat file: temp.a are: i386 x86_64 armv7 arm64
2、 分离不同架构的静态库

也就是说这里将会从temp.a中分离出i386 、x86_64、 armv7 、arm64 四个架构下的静态库,分别取temp_i386.a,temp_x86_64.a,temp_armv7.a,temp_arm64.a


在终端中继续输入如下命令: 
第一步:lipo -extract_family i386 -output temp_i386.a temp.a 
第二步:lipo -extract_family x86_64 -output temp_x86_64.a temp.a 
第三步:lipo -extract_family armv7 -output temp_armv7.a temp.a 
第四步:lipo -extract_family arm64 -output temp_arm64.a temp.a
3、删除静态库
在终端中继续输入如下命令:
第一步:ar -d temp_i386.a GPUImage.o 
第二步:ar -d temp_x86_64.a GPUImage.o 
第三步:ar -d temp_armv7.a GPUImage.o 
第四步:ar -d temp_arm64.a GPUImage.o 
4、合成新的静态库。名字为:new_library.a
lipo -create -output new_library.a temp_i386.a temp_x86_64.a temp_armv7.a temp_arm64.a

总结:总的方法和思路是这样的,但过程中还是会遇到不少问题,要一步步耐心的解决。

上一篇下一篇

猜你喜欢

热点阅读