美文网首页IOS开发
iOS 静态库、动态库、Framework、mach-O Ty

iOS 静态库、动态库、Framework、mach-O Ty

作者: mtko | 来源:发表于2020-04-06 17:04 被阅读0次

    一、库格式:
    库格式决定库独立性、库内文件类型、库内外文件依赖关系

    • Static Library:(静态性质 或 动态非共享性质 或 动态共享性质)
    • Framework(静态性质 或 动态非共享性质 或 动态共享性质)
    • Metal Library

    二、库性质(由mach -O Type决定):简单总结为
    库性质决定库加载到运行时内存的时机、加载的库范围、库的共享权限

    • 静态库
    • 动态非共享库
    • 动态共享库

    mach -O Type:一种文件格式,Mach Object文件格式,是Mac上的可执行文件类型 或者 目标文件(.o)。

    以开发者制作三方库的场景为例解释:

    Executable:  `静态库`,输出二进制
    Dynamic Library:`动态非共享库`,输出动态链接库非共享库,程序`运行`时链接到`内存,大部分场景下不可共享;app extension、部分macOS场景下可以共享
    Bundle:`动态非共享库`,和Dynamic Library相近,不过需要手动调用函数加载
    Static Library:  `静态库`,输出静态链接库,程序`编译`时拷贝到`内存`
    Relocatable Object File:`静态库`,和Static Library类似,但体积更小
    

    三、从结构上看,Framework格式的库只是比Static Library格式的库多出一个文件夹,拥有一个独立的工作区

    四、Framework格式的库中嵌入的依赖库可以和app环境的依赖库相同,并且不会产生duplicate symbol,因为Framework有独立的运行环境

    五、Static Library格式的库中的依赖库和app环境依赖库相同时会有依赖冲突

    六、Static Library格式的库的依赖的方法可以不实现,但Framework格式的库依赖的方法必须实现(objc)

    七、Static Library格式的库不可包含图片等资源文件

    八、Static Library格式的库的库在打包时会直接编译进app的二进制执行文件,Framework格式的库被打包进沙盒;如果观察过Product包内容时会发现使用<Static Library格式的库>或者<Framework格式的库且(mach -O Type = Static Library)>不会出现在Frameworks文件夹中,是因为编译进了app的二进制执行文件

    九、开发者签名的Dynamic Library性质的库时在app extension中共享或者在macOS部分场景下共享;苹果官方的动态库有共享权限

    十、制作三方库在考虑Static Library格式的库库或者Framework格式的库时:依赖图片资源,使用Framework格式的库;想要拥有完整的依赖关系,使用Framework格式的库,此时外界可能需要剔除Framework格式的库之外的依赖库,而采用Framework格式的库内的依赖库,否则虽然不会产生依赖冲突,但会增加包大小

    十一、制作三方库时,建议选择:

    • 库格式:Framework
    • 库性质(mach -O Type ):Static Library(mach -O Type)或者Relocatable Object File ,会天然处理嵌套等问题

    十二、Framework图标

    Framework内不嵌套Framework时: image.png

    Framework中嵌套Framework时:


    image.png

    相关文章

      网友评论

        本文标题:iOS 静态库、动态库、Framework、mach-O Ty

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