iOS制作.a静态库

iOS 制作.a静态库

在实际的开发工作中, 很多时候我们希望别人在使用自己开发的功能时,看不到自己的核心代码。 这时候就要制作静态库了。

1. 明确几个概念:

  1. 库就是代码的集合。
  2. 静态库在链接时会被拷贝到可执行文件中。 有多个程序使用了该静态库, 手机系统中就会有多份该静态库源码。
  3. iOS中静态库的存在形式: .a 和 framework。
  4. .a+.h+资源 = framwork

2. 开始制作.a静态库

  1. 打开Xcode, 选择Framework&Library下的Cocoa Touch Static Library。

    • 创建MySDK1工程,默认会有MySDK1.h和.m文件。
    • 删除自动生成的文件,重新创建JYUtils.h和.m文件, 写入几个方法。
  2. 这里假设已经完成了代码层面的开发, 现在要将MySDK1编译成.a静态库。

    • 选中Project-> MySDK1-> Info-> iOS Development Target, 选择8.0。(说明支持8.0以上系统)。

    IMG

    • 选中Targets-> MySDK1-> Build Settings->Build Active Architecture Only, 将Debug下的YES改为NO。(说明不仅仅构建当前活动的体系结构, 也就是构建所有的体系结构, 这个后面解释)
      IMG

    • 选中Targets-> MySDK1-> Build Phases-> Copy Files, 点击+号, 选择JYUtils.h(这里选择我们要暴露出去的.h文件)
      IMG

  3. Command+B编译工程(选择真机或者选择Generic iOS Device)。

    • 选中Products文件夹下的libMySDK1.a, 右键 ShowInFinder, 会看到Debug-iphones文件夹, 该文件夹包含include文件夹和libMySDK1.a文件。
      IMG
    • 这时候已经制作出来.a静态库文件了。(不过有坑, 请往下看)

3. 使用.a静态库

  1. 现在创建一个iOS工程UseMySDK1。

    • 将上面生成的include文件夹和libMySDK1.a文件拖入到工程中。
      IMG

    • 在控制器中引入头文件(#import “JYUtils.h”), 使用JYUtils中的方法。
      IMG

    • 使用真机运行, 按照上面步骤下来, 应该可以在真机上运行了。
  2. 现在不使用真机, 使用任意模拟器, 编译没问题, 但是运行会发现报错了。

    • 比如使用7模拟器, 报错信息如下:
      IMG
    • 不支持x86_64体系。
  3. 这是为什么呢?

    • 首先每一台iPhone真机设备都有自己的CPU。
      1. iPhone5s以后的设备CPU都是arm64。
      2. iPhone5s以前的设备CPU都是armv7和armv7s。
    • iPhone模拟器使用的CPU:
      1. iPhone5s~iPhoneX模拟器使用的CPU都是x86_64。
      2. iPhone5s以前的模拟器使用的CPU都是i386。
    • 现在我们在终端输入【lipo -info 静态库名称】, 会发现我们制作的静态库只支持armv7, arm64, 也就是说, 只支持真机, 不支持模拟器。
      IMG

    • 还记得一开始设置的Build Active Architecture Only 为 NO 吗?正是因为构建所有支持的体系结构, 所以会支持armv7(armv7也支持armv7s)和arm64。否则用iPhone5s以后的真机打出来的.a只支持arm64, 使用iPhone5s以前的真机打出来的.a只支持armv7(armv7s)。

  4. 那么怎么同时支持真机和模拟器呢?

    • 选中任意的模拟器。
    • Command+B编译工程。
      1. 选中Products文件夹下的libMySDK1.a, 右键 ShowInFinder, 会看到Debug-iphonesimulator文件夹。
      2. 终端输入【lipo -info 静态库名称】,会看到该.a支持的CPU有i386, x86_64。也就是支持目前所有的模拟器。(这里也是因为Build Active Architecture Only设置为NO了, 否则用iPhone5s以前的模拟器打出来的.a只支持i386, iPhone5s以后的模拟器打出来的.a只支持x86_64)。
      3. 使用该.a会发现模拟器下可以运行, 真机运行报错。
    • 现在既要支持真机, 又要支持模拟器, 那么就要合并两个.a。
      1. 在终端输入【lipo -create 真机静态库1 模拟器静态库2 -output 新静态库名】。
      2. 执行上述命令后会在当前文件目录下看到一个新的.a静态库。
        IMG
      3. 终端输入【lipo -info 新静态库名称】,会看到该.a支持的CPU有i386, x86_64, armv7, arm64。也就是支持所有模拟器和真机设备了。
        IMG
  5. 由于我们最终制作出来的.a静态库是要给第三方使用的, 而且会被上传AppStore。所以我们最终使用release模式下打出来的.a,而不是debug模式下打出来的.a。

    • 选中小房子(MySDK1)->Edit Scheme,将Build Configuration 改为release即可。
      IMG
    • 同样使用真机和模拟器分别编译, 右键ShowInFinder。会看到多了Release-iphones和Release-iphonesimulator文件夹。我们使用这两个文件夹下的.a合并成支持i386, x86_64, armv7, arm64的.a。
    • 收工。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值