1、首先,我们要先明白 other linker flag 的作用,它的意思是连接器,至于连接器是什么那就要先了解程序运行的步骤:
![](https://img.haomeiwen.com/i2453628/4f8486633bb3795d.png)
源文件经过一系列处理以后,会生成对应的.obj文件,然后一个项目必然会有许多.obj文件,并且这些文件之间会有各种各样的联系,例如函数调用。链接器做的事就是把这些目标文件和所用的一些库链接在一起形成一个完整的可执行文件。
苹果官方给出的解释是:
![](https://img.haomeiwen.com/i2453628/f89f16c2fb5fb1f9.png)
翻译过来的意思:大概意思就是Objective-C的链接器并不会为每个方法建立符号表,而是仅仅为类建立了符号表。这样的话,如果静态库中定义了已存在的一个类的分类,链接器就会以为这个类已经存在,不会把分类和核心类的代码合起来。这样的话,在最后的可执行文件中,就会缺少分类里的代码,这样函数调用就失败了。
解决办法:
在Other Linker Flags里加上所需的参数,用到的参数一般有以下3个:
(1)-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中,虽然这样可能会因为加载了很多不必要的文件而导致可执行文件变大,但是这个参数很好地解决了我们所遇到的问题。但是事实真的是这样的吗?如果-ObjC参数真的这么有效,那么事情就会简单多了。
(2)-all_load:当静态库中只有分类而没有类的时候,-ObjC参数就会失效了。这时候,就需要使用-all_load或者-force_load了。
-all_load会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。
(3)-force_load所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载。
(4)如果以上三种配置都没起作用,应该是你把.m文件导入到项目中了,仔细去查找看哪个类导入错误了
网友评论