美文网首页
Other Linker Flags

Other Linker Flags

作者: 一个栗 | 来源:发表于2020-12-10 16:10 被阅读0次

    常常在项目中遇到,配置静态库(.a文件)时,需要在Other Linker Flags中加入-Objc或-all_load,这样是为什么呢?

    链接器

    Other Linker Flags说白了就是ld命令除了默认参数外的其他参数,ld命令实现的事链接器的工作,详细说明可以在终端man ld查看。


    截屏2020-12-1015.46.58.png

    程序从代码到可执行文件往往要经历以下步骤:
    源代码 -> 预处理器 -> 编译器 -> 汇编器 -> 机器码 -> 链接器 -> 可执行文件
    源文件经过处理后,会生成对应的.obj文件,一个项目会有很多.obj文件,且这些文件会有各种各样的联系。链接器的作用就是把这些目标文件和所用的一些库链接在一起形成一个完整的可执行文件。
    OC的链接器并不会为每一个方法建立符号表,而仅仅为类建立符号表,这样如果静态库中定义了已存在的某个类的分类,链接器就会以为这个类已经存在,不会把分类和原类的代码合起来,这样的话,在最后的可执行文件中,就会缺少分类里面的方法,调用失败故报错。
    为了解决这个问题,就会在Other Linker Flags中加入-Objc或-all_load、-force_load,这三种的区别如下

    -Objc

    有了这个参数,链接器会把静态库中所有的OC类和分类都加载到最后的可执行文件中
    缺点:可能会加载了很多不必要的文件导致可执行文件变大;当静态库中只有分类而没有类的时候,-Objc会失效。

    -all_load

    会让链接器把所有找到的目标文件都加载到可执行文件中,但千万不能随便用这个参数!
    缺点:假如使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库里面可能有相同的目标文件,所以建议在-Objc失效的情况下用-force_load。

    -force_load

    作用和-all_load其实一样,但它需要指定要进行全部加载的库文件的路径,这样就只是完全加载了一个库文件,不会影响其他库的加载。

    相关文章

      网友评论

          本文标题:Other Linker Flags

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