-all_load 、-ObjC

作者: AlwaysBlue | 来源:发表于2016-03-29 16:29 被阅读2316次

    引入第三方库,因为添加了-all_load遇到的问题。为什么需要使用-all_load呢?

    相关的参数有-ObjC。该参数是用来加载和类别相关的文件的(也就是将所有和对象相关的文件都加载进来)。OC没有为每一个函数(方法)定义链接符号,它只为每个类创建链接符号。这样当一个静态库中使用类别来扩展已有类的时候,连接器不知道如何将类中原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现“selector not recognize”。

    在64位的mac系统和iOS系统下,链接器有一个bug,会导致只包含有类别的静态库无法使用-ObjC标志来加载文件。解决方法是使用-all_load或者-force_load标志。作用是加载静态库中的所有文件。不同的是-all_load是加载所有库。-force_load是必须指定具体的文件。

    按照上述理解,那如果使用-ObjC,就一定要使用-all_load了。因为-all_load是用来解决bug的。

    那么问题来了,我们在使用别的第三方库的时候一直都只用-ObjC,在引入百度地图的时候,有这样一段话
    如果您只在Xib文件中使用了BMKMapView,没有在代码中使用BMKMapView,编译器在链接时不会链接对应符号,需要在工程属性中显式设定:在Xcode的Project -> Edit Active Target -> Build Setting -> Other Linker Flags中添加-ObjC
    这个原因倒还真不是因为使用了类别,😄,而是没有显示引入。也就是说一般情况下,不加-ObjC就行。

    然后现在要引入-all_load的结果就是导致以前不会全部编译的arm64,现在也会参与了。

    提示有同名的zip.o

    根据提示的路径名,找到了

    预编译产生的文件

    所以解决办法就是改变zip文件的名称,或者第三方库去掉-all_load参数。
    此外,还知道了,编译静态库,其实还包括了我们项目中的代码。比如zip.o。。。。

    最后,推荐一个我自己的产品,找到我啦,可查看轨迹和定位,欢迎关注我的微信公众号,时刻关注找到我啦的更新

    相关文章

      网友评论

        本文标题:-all_load 、-ObjC

        本文链接:https://www.haomeiwen.com/subject/zmpclttx.html