编译的过程:
源代码 -> 预编译 ->编译器 -> 汇编器 -> 机器码 -> 连接器 ->可执行文件
1、iOS开发过程中引入的第三方静态库编译产生“duplicate symbol”,如何解决?
1)、引起这种问题的原因:
一般是文件里面使用了有C语言定义的全局变量或者是方法名,在导入时因为重复产生了冲突。
2)、解决思路:
a、设置build setting中的编译选项,一般包括:
-objc:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中。
-all-load: 加入这个参数后,会让链接器把所有找到的目标文件都加载到可执行文件中;但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。
-force_load: 所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载;
b、重新打包.a库:
先将.a库精心解压,找到响应的.o文件,移除,然后再进行打包,产生新.a文件;
c、宏编译处理:
预处理头文件中Prefix.h加一个宏定义;
针对冲突的文件进行宏定义处理,如:
网友评论