美文网首页
iOS 创建静态库(.a)

iOS 创建静态库(.a)

作者: 爱做梦的星星 | 来源:发表于2017-07-15 18:00 被阅读0次

    静态库(.a)

    文章类型: 学习笔记


    1. 静态库简介


    库的概念:

    1. 什么是库?
    - 库 就是程序代码的集合, 是共享程序代码的一种方式.
    
    1. 库的分类:
    - 1.开源库:公开源代码, 能看到具体实现,例如MJExtension, MJRefresh, AFNetworking...
    - 2.闭源库:不公开源代码, 是经过编译后的二进制文件. 看不到具体实现.主要分为: `静态库` 和 `动态库`.
    

    库的存在形式:

    1. 静态库的存在形式?
    - `.a`和`.framework`
    
    1. 动态库的存在形式?
    - `.dylib`(`.tbd`本质是一个描述文件,里面还是描述关联`.dylib`动态库的)和`.framework`
    

    静态库和动态库的区别?

    1. 静态库在链接时, 会被完整的复制到可执行文件中, 被多次使用, 就有多份拷贝.
    1. 动态库则不会复制, 只有一份. 程序运行时动态加载到内存, 系统只加载一次, 多个程序共用, 节省内存.
    • 注:

    1.但是!!! 项目中如果使用到自己的动态库, 不允许上架!
    2.再但是!!! WWDC2014上公布的 苹果对ios8开放动态加载dylib的接口 也就是说 开放了动态库挂载.


    静态库应用场景

    1. 保护自己的核心代码
    - 1. 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用
    - 2. 例如:百度地图,友盟,JPush等
    
    1. 将MRC的项目,打包成静态库, 可以在ARC下直接使用, 不需要转换
    2. 提高工程的编译速度

    静态库的特点?

    1. .a(.framework) + .h(头文件)
    1. 看不到具体实现的代码

    2. 静态库的制作(.a)

    创建一个.a静态库

    image_1bl2olid31pmffhn19214dpuqk1m.png-114.4kBimage_1bl2olid31pmffhn19214dpuqk1m.png-114.4kB

    写个方法

    + (void)log;
    
    + (void)log {
        NSLog(@"我是一个静态库");
    }
    

    编译成功后

    image_1bl2oo4js1ifm48hcmu150l1crh23.png-89.4kBimage_1bl2oo4js1ifm48hcmu150l1crh23.png-89.4kB
    image_1bl2ojs6l1bg61fkp1qst19iiqjr19.png-157.3kBimage_1bl2ojs6l1bg61fkp1qst19iiqjr19.png-157.3kB

    修改头文件目录目录

    image_1bl2oq7ao1hi91630dhr16a63nv2s.png-135.6kBimage_1bl2oq7ao1hi91630dhr16a63nv2s.png-135.6kB

    修改后编译结果

    image_1bl2osllv1s7h12at1v5c1h019q33c.png-93.5kBimage_1bl2osllv1s7h12at1v5c1h019q33c.png-93.5kB

    测试

    image_1bl2p2c971pn6s6usnauso4ar3p.png-247.1kBimage_1bl2p2c971pn6s6usnauso4ar3p.png-247.1kB

    结果

    1.使用6S模拟器进行测试, 通过
    2.使用真机, 编译; 失败

    3.使用低型号模拟器测试,; 失败

    原因分析

    1.模拟器下的静态库和真机下的静态库不能(各个模拟器型号之间架构也不一样)
    2.主要原因是模拟器和真机CPU架构不一样


    介绍架构

    不同机型的CPU, 对应的架构不同;
    模拟器: 4s----5 : i386 ;5s----7Plus : x86_64;
    真机:3gs---4s : armv7 ;5/5c : armv7s(armv7兼容armv7s);5s---7Plus: arm64;

    查看当前库的支持架构

    lipo -info 库的路径
    
    image_1bl2pjak5bkh1nk98ddsf1all4j.png-155.2kBimage_1bl2pjak5bkh1nk98ddsf1all4j.png-155.2kB

    库支持的架构

    image_1bl2pfajm10fu176k1ha81pk254g46.png-16.3kBimage_1bl2pfajm10fu176k1ha81pk254g46.png-16.3kB

    只编译当前选中架构,需要改成No,编译所有的模拟器架构,如果你需要编译真机的所以库改成这个:


    image_1bl2pllek1gc8ri4bjmm892ok50.png-135.5kBimage_1bl2pllek1gc8ri4bjmm892ok50.png-135.5kB
    image_1bl2pm4k211o219do1s511npi70t5d.png-21.1kBimage_1bl2pm4k211o219do1s511npi70t5d.png-21.1kB
    image_1bl2pn74r1bts7nq1mu5l9b15nf5q.png-121kBimage_1bl2pn74r1bts7nq1mu5l9b15nf5q.png-121kB

    真机和模拟器2个库太麻烦,合成一个库

    lipo -create + 一个库路径 + 另一个库路径 + -output +输出路径
    
    image_1bl2q2k3q1q7u2ctjsf14k4q8967.png-106.8kBimage_1bl2q2k3q1q7u2ctjsf14k4q8967.png-106.8kB

    合成特点

    1. 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
    1. 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
    2. 今后在使用.a时一定注意版本

    将合成的拆开

    //从其中一个架构抽出来
    lipo -thin 架构名称 架构路径 -output 目标路径
    
    //去除其中一个
    lipo -remove  架构名称 架构路径 -output 目标路径
    

    静态库的版本

    • 1.调试版本
      • 1.真机-Debug版本
      • 2.模拟器-Debug版本
      • 特点:
        • 调试版本会包含完整的符号信息,以方便调试
        • 调试版本不会对代码进行优化
    • 2.发布版本
      • 1.真机-Release版本
      • 2.模拟器-Release版本
      • 特点:
        • 发布版本不会包含完整的符号信息
        • 发布版本的执行代码是进行过优化的
        • 发布版本的大小会比调试版本的略小
        • 在执行速度方面,发布版本会更快些,但不意味着会有显著的提升
    • 3.生产不同的版本
      • 项目 -> Edit Scheme -> Run -> Release/Debug 分别进行编译

    相关文章

      网友评论

          本文标题:iOS 创建静态库(.a)

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