iOS三方库冲突(duplicate symbol)

C15B9422-0B9D-4FA6-9527-36BE34559C3D.png

duplicate symbol ...

iOS开发过程中我们经常用到很多三方库,图片上的报错你是不是也遇到过呢?(当然这个错也可能是项目中多次导入了某个类,本质和库里面包含相同类是一样的)

问题很简单就是duplicate symbol的问题。图片中的两个库都包含了MBProgressHUD,所以报错了。

废话不多说直接上解决办法:
image.png

找到项目的Build Settings ->搜索 other linker :填写-force_load 以及冲突库的路径

解决方法找到了,下面来说说为啥?

也许当你找到other linker flags的时候已经懵逼了,上面躺着-ObjC
91557039824_.pic.jpg
-force_load表示不服。很多时候我们导入了很多苦库里面有分类,所以other linker flags 也就已经添加了-ObjC(作用看最下面的解释),如果你other linker flags没有设置的话也就不存在这个报错了。

other linker flags可以设置的三种:
ObjC
一般这个参数足够解决前面提到的问题,这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。这样编译之后的app会变大,因为加载了很多不必要的文件而导致可执行文件变大。但是如果静态库中有类和category的话只有加入这个flag才行,但是Objc也不是万能的,当静态库中只有分类而没有类的时候,Objc就失效了,这就需要使用-all_load或者-force_load了。

-all_load
-all_load会强制链接器把目标文件都加载进来,即使没有objc代码。但是这个参数也有一个弊端,那就是你使用了不止一个静态库文件,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件 这里会有两种方法解决 1:用命令行就行拆包. 2:就是用下面的这个参数

-force_load
这个flag所做的事情跟-all_load其实是一样的,只是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载 .

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。