iOS "duplicate symbol"解决第三方库之间的冲突

本文介绍了在iOS开发中遇到'duplicate symbol'错误的常见原因,包括文件重复引入、Target设置问题和第三方库冲突。着重讨论了当使用两个静态库时如何解决这类冲突,通过查看库的CPU架构、分离静态库、删除冲突部分并合成新库的方法来解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题叙述

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值