美文网首页
静态库和动态库

静态库和动态库

作者: 宙斯YY | 来源:发表于2018-07-17 17:11 被阅读12次

    一.基础概念

    1.从开源角度讲,常见库的种类可以分为开源库和闭源库,iOS中静态库和动态库都属于闭源库,常见的AFN,MJExtension属于开源库。
    2.静态库和动态库的文件后缀
    • 静态库:以.a 和 .framework为文件后缀名。
    • 动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名。
    3.静态库和动态库的区别
    • 静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。
    • 动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内存。
    4.iOS设备架构
    • 模拟器:
      iPhone4s-iPnone5:i386
      iPhone5s-:x86_64
    • 真机设备
      iPhone3gs-iPhone4s:armv7
      iPhone5-iPhone5c:armv7s
      iPhone5s-:arm64

    二.静态库打包

    .a静态库文件打包
    1.创建文件
    1.png

    此时.a文件是红色状态


    2.png
    2.创建新文件之后,把头文件暴露给外部使用
    3.png
    3.修改配置文件并编译

    我们需要把Build Active Architecture Only修改为NO,否则生成的静态库就只支持当前选择设备的架构。


    4.png

    我们分别选择Generic iOS Device和任意一个模拟器各编译一次,编译完后,我们会看到工程中Products文件夹下的libTest.a由红色变成了黑色,然后show in finder,看看生成的文件。


    5.png
    此时生成Debug-iphoneos/libTools.a和Debug-iphonesimulator/libTools.a两个.a文件,一个是模拟器架构下使用的,一个是真机架构环境下使用的。但都是Debug版本的。
    如果想使用Release版本的:
    6.png

    选择Release并且再次编译。(Release版本比Debug版本运行速度更快,更轻量级)

    4.验证.a文件支持的架构环境并合并
    • 验证:lipo -info 静态库名字
      验证静态库支持的架构
    • 合并:lipo -create 第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径
      把模拟器环境和真机环境的.a文件合并成一个.a文件
      8.png

    把.a文件和头文件集添加进入项目就可以使用。

    5.打包前调试

    因为静态库只能编译,那么我们如何调试代码呢?
    A.新建一个普通工程
    B.添加一个.a静态库的TARGETS(配置和编译步骤同上)-图1
    C.主工程TARGETS关联静态库-图2、3


    1.png

    D.引入头文件进行调试


    1.png

    .framework静态库文件打包

    1.创建文件
    1.png

    此时.framework文件是红色状态


    2.png
    2.创建新文件后,把头文件暴露给外部使用
    3.png
    3.修改配置文件并编译

    我们需要把Build Active Architecture Only修改为NO,否则生成的静态库就只支持当前选择设备的架构。


    4.png

    我们分别选择Generic iOS Device和任意一个模拟器各编译一次,编译完后,我们会看到工程中Products文件夹下的TestFramework.framework由红色变成了黑色。
    把Mach-O文件修改为静态库类型(因为.framework类型可为动态库也可为静态库)


    5.png
    此时生成Debug-iphoneos/TestFramework.framework和Debug-iphonesimulator/TestFramework.framework两个.framework文件,一个是模拟器架构下使用的,一个是真机架构环境下使用的。但都是Debug版本的。
    如果想使用Release版本的:
    6.png

    选择Release并且再次编译。(Release版本比Debug版本运行速度更快,更轻量级)

    4.验证.a文件支持的架构环境并合并
    • 验证:lipo -info 静态库名字
      验证静态库支持的架构
    • 合并:lipo -create 第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径
      eg:lipo -create /Users/zhousiyang/Desktop/liba/ToolFramework.framework/ToolFramework /Users/zhousiyang/Desktop/liba/ToolFramework2.framework/ToolFramework -output /Users/zhousiyang/Desktop/liba/final
      把模拟器环境和真机环境的.framework文件合并成一个.framework文件
      6.png
      替换任意一个内部的.framework文件然后导出使用
    5.打包前调试(同.a文件)
    6.静态库.a和.framework的区别

    .a文件只是单纯的二进制文件(代码),而.framework可以包含资源文件(图片音视频-建议使用Bundle包装避免和外部重名)。

    相关文章

      网友评论

          本文标题:静态库和动态库

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