zoukankan      html  css  js  c++  java
  • iOS开发中静态库之".framework静态库"的制作及使用篇

    iOS开发中静态库之".framework静态库"的制作及使用篇

    • .framework静态库支持OC和swift

    .a静态库如何制作可参照上一篇: iOS开发中静态库之".a静态库"的制作及使用篇

    一.OC创建.framework静态库

    1.创建工程,语言选择OC

    2.进入工程后,会自动帮我们创建一个.h文件,主头文件,和我们项目名称一般完全一致.不要删除了!

    3.编写核心代码

    • 依旧使用简单示例,MathTools

    MathTools.h文件

    @interface MathTools : NSObject
    
    + (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2;
    
    @end
    

    MathTools.m文件

    @implementation MathTools
    
    + (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2
    {
        return num1 + num2;
    }
    
    @end
    

    4.制作.framework静态库

    • cmd + B 编译一下
    • 我们就会发现在Products文件下面有个实体的.framework文件
    • 右键Show In Finder
    • 发现文件夹内有个.h头文件,但它是主头文件,并不是我们想暴露出去的头文件,我们想暴露的头文件是MathTools.h
    • 来到项目配置,把MathTools.h文件暴露出去

    01.framework

    • 把MathTools.h拖到Public之后,cmd + B编译一下
    • Show In Finder,发现Headers文件夹内有两个.h文件了,我们要暴露的.h文件也在内
    • 大家可能还会发现一个exec的文件,它其实就是我们的.m文件被编译之后的二进制文件

    5.测试.framework静态库,先使用OC创建测试工程

    • 将我们制作好的.framework静态库拖入测试的工程项目中

    • 假如我们用OC创建的测试工程

    • 在ViewController中执行touchBegan方法,点击控制器获取结果

      • 在ViewController.m文件中导入静态库的主头文件 #import <MTYMathToolsOC/MTYMathToolsOC.h>
      • 但是我们这时在方法里是拿不到我们静态库中的方法实现的,因为我们并没有在上面的主头文件中导入MathTools.h头文件.
      • 导入MathTools.h头文件,执行touchBegan方法,cmd + R运行程序
      
      - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
      {
      	 NSLog(@"%ld",[MathTools sumNum1:30 num2:40]);
      }
      
      
      • 发现程序崩溃了
      // 动态库不能被加载
      dyld: Library not loaded:
      

    5.1.Bug1解决 - dyld: Library not loaded:

    • 我们默认情况下编译出来的.framework库是一个动态库
    • 点击工程 -> General 我们发现,系统在我们编译时默认给我们添加了一个库,在Linked Frameworks and Libraries位置
    • 但是动态库不是在这里添加,在上面的Embedded Binaries处添加

    02.framework

    • 这时在下面仍旧会为我们默认添加这个库,但是这回不要把它删了,运行
    • 这时我们的静态库就可以被使用了

    5.2.虽然上面.framework静态库可以被使用,但是它是个动态库,一般开发中我们用的都是静态库

    5.3.如何将我们编译.framework改成静态库?

    • 点击工程 -> BuildSetting -> 搜索mach -> 改成Static Library

    03.framework

    • 配置好后,重新编译一下,然后将新的.framework文件拖入测试工程内,编译(别忘了在静态库的主头文件内导入MathTools.h文件)

    5.4.但是仍旧存在一个CPU架构支持的问题

    • 这个问题上篇.a静态库中有提及

    • 上面是选择的iPhone 7模拟器,在iPhone 5及真机上仍旧会报错

    • 如何解决?(其实步骤同上篇.a的bug解决步骤几乎一样)

      • 仍旧是终端输入lipo -info来检测
      • 发现支持x86_64
      • 注意: 这里不能直接lipo -info我们的静态库文件,因为它本质和文件夹的作用是一样的,要lipo -info它里面的MTYMathToolsOC这个exec文件.
    • 两种方法解决?

      • 方法1:直接项目配置: 项目 -> Build Setting -> Build Active Architecture Only -> Debug 改为No(上篇文章有配图)
      • 方法2:弄两个.framework文件,终端create合并(同.a文件的操作方法)
    • 但是真机仍旧报错

      • 把.framework静态库选择真机编译一下
      • 终端执行create命令合并成一个MTYMathToolsOC的exec文件,这个文件名必须一致,不能乱写
      • 合并之后查看新的静态库支持的CPU架构
      Architectures in the fat file: MTYMathToolsOC are: i386 x86_64 armv7 arm64 
      
      • 把MTYMathToolsOC文件拷贝到原来的库文件中,替换掉原来的exec文件
      • 就可以使用了

    6.使用swift来创建测试工程,看静态库是否可用

    • 创建swift工程
    • 导入我们制作好的静态库文件到项目中
    • 在ViewController.swift中,导入库的头文件,这里我们可以直接敲出来
    import MathToolsOC
    
    • 那么在touchBegan方法中能否敲出方法名呢,试验一下发现并不能.
    • 在swift中,导入库的头文件其实就是导入框架的主头文件MathToolsOC.h,然而我们之前在MathToolsOC.h中并没有把MathTools.h导入其中
    • 所以把MathTools.h导入其中
    • 运行报错,因为我们并没有配置动态库那个步骤

    错误信息

    // 动态库未加载
    dyld: Library not loaded
    
    • 配置过后就会发现,在swift中测试也没有问题

    • 注意点

    1.为什么这次没有把动态库转为静态库?
    因为swift中是不支持静态库的,所以转换的话,会报错
    2.动态库转静态库的方法见上面
    

    二.用swift来创建.framework库

    • 其实步骤和前面差不多,最初创建时都会遇到这几个问题?

      • .framework默认创建出来是动态库,要在General下面进行配置,在Embeded Binaries添加动态库
      • CPU支持的架构问题.这个同前面方法一样,终端最后合并一下就好
    • 由于步骤相差不大,这里就不再赘述了,但除了上面的bug还有有几个注意点

      • swift中不支持静态库,就是说以前我们创建的.framework库默认是动态库,最后要转为静态库使用,这在OC中可以,但在swift中不可以,如果这里把动态库转为静态库的话,那么就会报错
      • swift创建静态库的时候, 类及类方法前面加上public,以便外界可以调用
  • 相关阅读:
    MySQL中去重字段完全相同的数据
    SVN自动更新-win平台
    EF出错:Unable to convert MySQL date/time value to System.DateTime
    微信不支持Object.assign
    记录一下dotnetcore.1.0.0-VS2015Tools.preview2安装不上的问题
    Ajax表单异步上传(包括文件域)
    .NET web开发之WebApi初试水
    遍历数组一次求得数组的平均数、标准差、方差
    记STM32F030多通道ADC DMA读取乱序问题
    RT-Thread入门和模拟器的配置生成
  • 原文地址:https://www.cnblogs.com/mtystar/p/6083288.html
Copyright © 2011-2022 走看看