欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

手动创建静态库【.framework、.a】详解-不包含资源文件

程序员文章站 2024-03-22 21:57:04
...

组件 静态库 资源文件 手动创建 .framwork .a

本篇将讲解手动创建静态库(不包括资源文件)事例(Git):CustomEngine 自定义管理类

一、创建项目工程

  • Mac 系统 macOS Mojave 10.14.6
  • Xcode 版本 11.0.0
  • 静态库最低支持 IOS 9.0

上一篇 IOS 静态库和动态库详解 里面介绍了静态库 【.framework .a】的区别,这里将使用.framework来讲解。

打开Xcode选择 File–>New–>Project,然后选择IOS中Framework&Library 中的 Framework
如图:手动创建静态库【.framework、.a】详解-不包含资源文件
我这里使用CustomFramework来命名。
如图:手动创建静态库【.framework、.a】详解-不包含资源文件

创建成功后项目结构,修改你支持系统,我这里修改为IOS 9.0
如图:
手动创建静态库【.framework、.a】详解-不包含资源文件项目中CustomFramework.h文件,用来#import自己的文件
手动创建静态库【.framework、.a】详解-不包含资源文件
创建CustomString文件如图:手动创建静态库【.framework、.a】详解-不包含资源文件

在CustomFramework.h中导入

#import <CustomFramework/CustomString.h>

如图:手动创建静态库【.framework、.a】详解-不包含资源文件
在CustomString.h文件中添加一个方法:

+ (void)stringLog;

如图:手动创建静态库【.framework、.a】详解-不包含资源文件
在CustomString.m文件中实现这个方法:

+ (void)stringLog {
    NSLog(@"CustomString-stringLog");
}

如图:手动创建静态库【.framework、.a】详解-不包含资源文件

二、配置项目工程

  • 配置项目打包类型。

项目默认打包出来是动态库(Mach-O Type 值为:Dynamic Library),静态库的Mach-O Type 值为:Static Library。需要在Build Settings–>Linking–>Mach-O Type修改类型。
如图:手动创建静态库【.framework、.a】详解-不包含资源文件

  • 配置项目支持设备类型-CPU架构

模拟器:i386、x86_64;
真机:armv6、armv7、armv7s、armv64、armv64e;
具体可以参考: iOS 中的 armv7,armv7s,arm64,i386,x86_64 都是什么
需要在Build Settings–>Architectures–>Valib Architectures或者Valib Architectures修改类型。
如图:
手动创建静态库【.framework、.a】详解-不包含资源文件

  • 配置项目暴露文件

暴露出来的文件,使用者可以看到源码。
比如git上公开的AFNetworking。如果不想暴露实现文件【.m】,那么只需要暴露.h文件
需要在Build Phases–>Headers中把Prject文件拖动到Public中。

拖动前,如图:
手动创建静态库【.framework、.a】详解-不包含资源文件
拖动后,如图:手动创建静态库【.framework、.a】详解-不包含资源文件

如果想把.m文件暴露,那么在Prject点击 +,出现选择框,选中你需要暴露的.m文件,点击add添加到Prject中,然后在拖动到Public。如图:手动创建静态库【.framework、.a】详解-不包含资源文件
静态库暴露文件查看,如图:手动创建静态库【.framework、.a】详解-不包含资源文件

  • 配置项目打包模式

这里打包模式是指:Debugrelease两种模式。
需要在Build Settings–>Architectures–>Build Active Architecture Only修改。
通常Debug选择YES,而release选择NO。如果是YES,代表静态库只针对当前设备的架构打包,即只针对图中设备模拟器iPhone 11ProMax的架构x86_64进行打包
手动创建静态库【.framework、.a】详解-不包含资源文件

设置release模式如图:
手动创建静态库【.framework、.a】详解-不包含资源文件
手动创建静态库【.framework、.a】详解-不包含资源文件
选择Build Configuration 为:Release,点击Close保存。

三、项目工程打静态库

  • 支持真机的静态库;

    1. 选择真机
      手动创建静态库【.framework、.a】详解-不包含资源文件

    2. 选择后,.framework库是红色的,表示还不存在。如图:手动创建静态库【.framework、.a】详解-不包含资源文件

    3. Command + B运行项目后,.framework库变为黑色,表示存在,并且可以在Finder中查看 如图:
      手动创建静态库【.framework、.a】详解-不包含资源文件

    4. 点击Show in Finder 查看,真机库文件Release-iphoneos里面有一个CustomFramework.framework
      手动创建静态库【.framework、.a】详解-不包含资源文件
      手动创建静态库【.framework、.a】详解-不包含资源文件

    5. 检查CustomFramework.framework支持的CPU架构;lipo -info 静态包地址(你自己库的地址)手动创建静态库【.framework、.a】详解-不包含资源文件

  • 支持模拟器静态库

    1. 选择任意一款模拟器,我这里选择的是iPhone 11ProMax; 没有运行时候.framework是红色的,表示不存在;如图:
      手动创建静态库【.framework、.a】详解-不包含资源文件
    2. Command + B运行项目后,.framework库变为黑色,表示存在。如图:
      手动创建静态库【.framework、.a】详解-不包含资源文件
    3. 点击Show in Finder 查看,真机库文件Release-iphonesi mulator里面有一个CustomFramework.framework。如图: 手动创建静态库【.framework、.a】详解-不包含资源文件
    4. 检查CustomFramework.framework支持的CPU架构;lipo -info 静态包地址(你自己库的地址)。如图:手动创建静态库【.framework、.a】详解-不包含资源文件
      至此:真机、模拟器的静态包全部打包完。那个两个包在使用的时候很不方便。将进行库合并.
    • 合并真机、模拟器静态库
      使用 lipo -ceacte 真机静态库路径 模拟器静态库路径 -output 合并后的静态库路径
      在这里我直接使用库的绝对位置(可以cd到Xcode/DerivedData/项目名称/Build/Products中,可以看到如下图 真机库:Release-iphoneos 和 模拟器库:Release-iphonesi mulator两个文件 ),合并后静态库路径我这里使用的真机库路径(可自定义路径)。
      如图:
      手动创建静态库【.framework、.a】详解-不包含资源文件
      合并之后,检查CPU架构。
      合并库的CPU架构:包含真机库、模拟器库CPU架构总和。
      如图:手动创建静态库【.framework、.a】详解-不包含资源文件

静态库.framework全部完成。可以把合并的库给别人使用。
.a库制作与.framework差不多。

在检查CPU架构或者合并静态库时候,需要注意地方是路径,

  • .a的路径:.../Release-iphoneos/CustomFramework.a
  • .framework的路径:.../Release-iphoneos/CustomFramework.framework/CustomFramework
    ,CustomFramework.framework后面必须加/CustomFramework

四、使用合并静态库

打开Xcode选择 File–>New–>Target,然后选择IOS中Application 中的 Single View App

  • 创建Single View App工程,名称为:CustonFrameworkDemo
    如图:
    手动创建静态库【.framework、.a】详解-不包含资源文件
    手动创建静态库【.framework、.a】详解-不包含资源文件

    创建名称为:CustonFrameworkDemo工程手动创建静态库【.framework、.a】详解-不包含资源文件
    创建成功后,如图:手动创建静态库【.framework、.a】详解-不包含资源文件

  • 配置CustonFrameworkDemo工程

    • 1、 切换运行工程。如图:手动创建静态库【.framework、.a】详解-不包含资源文件
    • 2、 添加CustomFramework.framework
      选择TARGETS中的CustomFrameworkDemo,General–>Frameworks,Libraries,and Embedded Content中点击+,选择CustomFramework.framework
      点击Add
      默认:手动创建静态库【.framework、.a】详解-不包含资源文件
      点击+后,选择静态库(CustomFramework.framework),并添加(Add)。如图:
      手动创建静态库【.framework、.a】详解-不包含资源文件
      添加成功后样式。如图:
      手动创建静态库【.framework、.a】详解-不包含资源文件
  • 运行CustonFrameworkDemo工程

    • 1、在ViewController中导入 CustonFramework.framework中的文件
      导入方式三种-任选其一

      • #import <CustomFramework/CustomFramework.h>
      • #import <CustomFramework/CustomString.h>
      • @import CustomFramework.CustomString;

      如图:手动创建静态库【.framework、.a】详解-不包含资源文件

  • 2、在viewDidLoad中添加CustomString的测试代码

    NSLog(@"开始测试CustomString");
    [CustomString stringLog];
    NSLog(@"结束测试CustomString");
    

    如图:手动创建静态库【.framework、.a】详解-不包含资源文件

  • 3、运行CustonFrameworkDemo工程
    运行成功,按预期出现。
    模拟器:
    手动创建静态库【.framework、.a】详解-不包含资源文件
    真机(RoverWord):手动创建静态库【.framework、.a】详解-不包含资源文件

工程代码参见Github