iOS架构-静态库.a的打包及使用(2)

补充知识-框架分类:
模拟器架构:
• i386 : 32位架构 4S ~ 5
• x86_64 : 64位架构 5S ~ 现在的机型
真机架构:
• armv7: 在最老的支持iOS7的设备上使用
• armv7s: 在iPhone5和5C上使用 (armv7s架构被苹果放弃了)
• arm64: 运行于iPhone5S的64位 ARM 处理器 上

目标:

打包成模拟器和真机都能运行的静态库.a包,形成SDK文件包提供给客户使用。
SDK文件包:头文件.h集合、通用.a包

环境

Xcode 10.1
默认新建的支持架构为x86_64arm64(如需增加架构arm7s 需要在设置中添加)

修改框架的方式如下图:
iOS架构-静态库.a的打包及使用(2)_第1张图片
debug 项默认为 YES ,表示仅生成当前选择的框架的库; release 项默认为 NO ,表示生成支持所有模拟器或真机的库。生成的库将会保存在 products 目录下的不同分类目录内:

iOS架构-静态库.a的打包及使用(2)_第2张图片

iOS架构-静态库.a的打包及使用(2)_第3张图片
不将Build Configuration改为Release,则打包出来的静态库会存于【Debug-iphoneos】和【Debug-iphonesimulator】两个文件夹下。我们一般都使用Release模式,因为程序最终发布之后是Release版的,所以静态库也是在Release模式下使用。

合成模拟器的架构【默认:模拟器编译只会生成对应的1种架构,真机编译会合成两种架构】
iOS架构-静态库.a的打包及使用(2)_第4张图片
这里,设置为YES,那么编译出来的.a静态库就只包含当前设备的架构。
举个例子:如果我们选择iPhone 5模拟器【Command+B】编译,则编译出来的.a静态库只能用iPhone4s~5模拟器跑程序, 用iPhone5s~6plus,则会报找不到x86_64的libFMDB库。设置为 NO 之后,【Command+B】不管选择哪个【模拟器】,则都会把【386 : 32位架构 4S ~ 5】【x86_64 : 64位架构 5S ~ 现在的机型】的架构都打包合并。

注】【真机】不设置 [Build Active Architecture Only] 也默认会自动合并的armv7 和amr64架构 。但是 armv7s架构被苹果放弃了,真机要想合并armv7s的话需要进行如下操作再编译。(其实没必要设置这个)
iOS架构-静态库.a的打包及使用(2)_第5张图片
四. 合成架构

一般来说, 只需要前两步即可

  1. 模拟器架构的合成: Target --> Build Settings --> Build Active Architecture Only(是否只编译当前架构) --> Debug 改为NO(改为NO, 模拟器就可以直接合成2种架构)

  2. 真机和模拟器合并: lipo -create 静态库1.a 静态库2.a -output 新静态库.a

  3. armv7s这个架构, 在2014年10月份的xcode版本更新中, 取消了默认导出此架构. 可以不用支持此架构. 如果要支持, 需要手动添加3个架构.

第一步:编译出模拟器和真机.a文件

  1. 在桌面创建 ProjectDemos 的文件
  2. 创建.a 静态库工程 名字为 VideoPlayerLib 放置于ProjectDemos
    iOS架构-静态库.a的打包及使用(2)_第6张图片
  3. 在.h 中声明方法
    iOS架构-静态库.a的打包及使用(2)_第7张图片
  4. 在.m中实现方法
    iOS架构-静态库.a的打包及使用(2)_第8张图片
  5. 修改SDK支持的最低系统版本 iOS Deployment Target iOS 8.0
    iOS架构-静态库.a的打包及使用(2)_第9张图片
  6. 分别选中 模拟器和Generic iOS Device 编译之后,在下面Products 下libVideoPlayerLib.a 红色变成了的白色,Show In Finder查看所在目录
    iOS架构-静态库.a的打包及使用(2)_第10张图片
  7. 在路径Debug-iphoneos 和Debug-iphonesimulator 下生成了libVideoPlayerLib.a
    这样就有了真机和模拟器的.a 包了,头文件在include中
    iOS架构-静态库.a的打包及使用(2)_第11张图片

第二步:合并成通用包.a

这里使用终端命令去合并,脚本自动化合并打包将会在(二)中详细讲解
DEVICE_DIR_A 真机.a 路径
SIMULATOR_DIR_A 模拟.a 路径
INSTALL_DIR_A 通用.a 路径

#合成模拟器和真机.a包
lipo -create DEVICE_DIR_A SIMULATOR_DIR_A -output INSTALL_DIR_A

这里我把合成的生成在工程的Products 下,libVideoPlayer.a 通用包名

lipo -create /Users/suning/Desktop/ProjectDemos/VideoPlayerLib/Build/Products/Debug-iphonesimulator/libVideoPlayerLib.a /Users/suning/Desktop/ProjectDemos/VideoPlayerLib/Build/Products/Debug-iphoneos/libVideoPlayerLib.a -output /Users/suning/Desktop/ProjectDemos/VideoPlayerLib/Build/Products/libVideoPlayer.a


iOS架构-静态库.a的打包及使用(2)_第12张图片
执行后我们可以看到:目标.a
iOS架构-静态库.a的打包及使用(2)_第13张图片验证合成包的架构是否成功

lipo -info 目标.a路径

iOS架构-静态库.a的打包及使用(2)_第14张图片

第三步:SDK文件包,并导入工程使用

  1. 把真机中的include 文件夹和合并的.a copy到一个桌面上新的文件夹Mylib中
    iOS架构-静态库.a的打包及使用(2)_第15张图片
  2. 在demo工程中使用.a 添加桌面上Mylib文件夹
    1. 添加文件选择 Create Group (黄色的/folder 蓝色实体文件)
    2. build phases 添加头文件
    3. 编译,使用处导入头文件。
      iOS架构-静态库.a的打包及使用(2)_第16张图片
      // 使用处
      [[VideoPlayerLib sharedInstance] openPlayerWindow];

这个种方法弊端:
1.要终端打包,打包后还要验证
2.要手动组成 Mylib 文件夹

下篇文章解决这个问题:使用脚本,一键打包成Mylib。嗨上天!

结束!

你可能感兴趣的:(iOS,架构之路)