前言
做iOS的过程中会引用一些三方库,而这些库,有的是.a,有的是.framework,有的是.dylib,有的是.tbd,说实话,我还是比较晕的,做个笔记,方便记忆QAQ。
静态库和动态库
静态库(.a)和动态库(.dylib)都是编译好的二进制文件,区别在于用法。
对于一个静态库而言,其实已经是编译好的了,类似一个 .o 的集合。在 build 的过程中只会参与链接的过程,而这个链接的过程简单的讲就是合并,并且链接器只会将静态库中被使用的部分合并到可执行文件中去,在编译链接的时候,会将静态库的所有文件都添加到目标 app 可执行文件中,并在程序运行之后,静态库与 app 可执行文件 一起被加载到同一块代码区中。
对于动态库而言,其实分 动态链接库 和 动态加载库 两种的,这两个最本质的区别还是加载时间。
动态链接库:在没有被加载到内存的前提下,当可执行文件被加载,动态库也随着被加载到内存中。
动态加载库:当需要的时候再使用 dlopen 等通过代码或者命令的方式来加载。
但是不论是哪种动态库,相比较与静态库,动态库处理起来要棘手的多。由于动态库是动态的,所以你事先不知道某个函数的具体地址。因此动态链接器在链接函数的时候需要做大量的工作。
不管是静态库、动态库,两者的区别和在内存哪个区域没有关系,最本质的区别是,一个的函数调用在编译的时候就已经确定,而动态库是动态加载的。换句话说,静态库修改了东西,整个程序需要重新编译,而对于动态库的修改而言,只需要重启 app(重置 PLT )
注:
Mac下,.a文件指静态库,.dylib指动态库,.tbd其实是一个YAML文件,描述了需要链接的动态库的信息。主要目的是为了减少app 的下载大小,在xcode7以后用来取代.dylib。为了更方便的使用动态库和静态库(一般情况下,使用.a或者使用.tbd,都要配合资源文件和头文件使用),所以我理解下来,『.framework = .a/.tbd + .h + bundle』
最后
其实关于Xcode怎么创建.framework,网上有很多教程,就不多说了,这篇文章都是参考了网上别人的说法,为了方便记忆和理解,才记录下来的,其实说到动态库和静态库的优缺点,说法很多,至于怎么选择,还是看具体项目比较合适,目前我的认识还很浅,如果有更好的理解了,再来更新,mark!!!QAQ
拓展
说到.a文件,关于.a文件的多平台支持,还是需要研究一下的,这里先记录下了,armv7 ,i386, x86_64 ,arm64,还有动态库实现app的热修复(继续学习,我猜想JSPatch的思路应该是这样的)。