当我们看到符号冲突(duplicate symbols)的错误时,就是xcode工程引入相同的三方类库或者创建了和三方类库相同类和方法。
如果duplicate symbols后面重复的位置有一处是以.c或者.m源码方式存在。解决方案如下
方案一:手动修改.c或者.m源码,
在duplicate symbols提示的重复内容加前缀或者后缀,总之改成不一致的即可。
附上快速修改类名或者方法名的方法
方案二采用宏定义重命令
在xcode工程中,查找是否存在预编译头文件(一般为xxx.pch), 如果没有则新建一个并在build setting里面设置预编译头文件路径。
如果没有且不知道如何添加,请参考文章【添加pch文件及相关配置】操作。
记得把Precompile Prefix Header下边的Prefix Header中pch文件路径改成相对路径即项目名称/xxx.pch或$(PRODUCT_NAME)/xxx.pch
在预编译头文件里面添加重复类名的宏定义重命令的代码,示例如下
#define AFURLSessionManager XNGURLSessionManager
#define AFNetworkingReachabilityDidChangeNotification XNGNetworkingReachabilityDidChangeNotification
#define AFImageResponseSerializer XNGImageResponseSerializer
...
此方案参考了【iOS静态库开发中引入的第三方库可能与宿主APP中冲突的解决方案】。
如果duplicate symbols后面重复的位置均是以.a或者.framework的方式存在,解决方案如下
能找到生成.a或者.framework的三方库工程
参照上文修改重复内容或者宏定义重命名的方式处理完毕之后重新生成.a或者.framework文件替换。
不能找到生成的.a或者.framework
1.cd xxx.a文件夹
2.lipo xxx.a -thin arm64/armv7 -output temp/xxx-arm64/armv7.a 瘦身并放入指定文件夹
3.ar -t temp/xxxx-arm64.a
4.cd temp && ar xv xxxx-arm64.a -------
5.rm xxxxx.o --------------------------
6.cd .. && ar rcs xxxx-arm64.a temp/*.o --------
7lipo -create xxxx-arm64.a xxxx-armv7.a -output xxxx.a 把处理后的.a文件合并起来
4.5.6可以使用ar -d -sv XXXXX-arm64.a XXXX.o 移除.a中指定的.o文件。
可参阅本人的另一篇文章【xcode中引入两个静态库冲突'duplicate symbol'的解决方法】。