ios打包静态库

 

 

一、 什么是库?ios

所谓库就是程序代码的集合,是共享程序代码的一种方式。架构

二、 库的分类框架

根据程序代码的开源状况,库能够分为两类iphone

  • 开源库
    源代码是公开的,你能够看到具体实现。好比GitHub上比较出名的第三方框架AFNetworking、SDWebImage。
  • 闭源库
    不公开源代码,只公开调用的接口,看不到具体的实现,是一个编译后的二进制文件。这种常见于一些公司的SDK包,好比高德地图SDK、环信即时通信SDK等等。而闭源库又分为两类:静态库和动态库。本篇重点要讲的即是其中的静态库。

三、静态库和动态库的存在形式和使用区别工具

存在形式:测试

  • 静态库
    以".a"或者“.framework”为文件后缀名
  • 动态库
    以".dylib"或者“.framework”为文件后缀名

使用区别:ui

  • 静态库连接时会被完整的复制到可执行文件中,被屡次使用就有多份拷贝。
 
静态库被程序使用时
  • 动态库连接时不复制,程序运行时由系统动态加载到内存,供程序调用。并且系统只加载一次,多个程序共用,节省内存。
 
动态库被程序使用时

四、iOS 设备的CPU架构3d

  • 模拟器:
    4s-5: i386
    5s-7 Plus: x86_64日志

  • 真机(iOS设备):
    armv6: iPhone、iPhone 二、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)
    armv7: iPhone 3Gs、iPhone 四、iPhone 4s、iPad、iPad 2
    armv7s: iPhone 五、iPhone 5c (静态库只要支持了armv7,就能够在armv7s的架构上运行)
    arm64: iPhone 5s、iPhone 六、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPad Air、iPad Air二、iPad mini二、iPad mini3code

注:真机iPhone七、iPhone7 Plus A10处理器究竟是什么架构暂时不得而知,没查到相关资料,貌似还没公布,可是模拟器是x86_64。

3、打包静态库

由于静态库存在两种形式,咱们先看.a静态库的打包

  • .a文件静态库打包

一、打开Xcode建立一个新的工程,这里以Xcode8为例,选择工程以下:

 
建立一个新的工程

二、建立工程完毕后,再建立一个工具类StaticLibTool,添加一个方法用于测试


 
建立一个工具类,添加测试方法

StaticLibTool.m文件实现以下

 
taticLibTool.m文件实现

三、运行工程进行打包

 
运行工程打包

运行完毕后,咱们会看到工程中Products文件夹下的libStaticLib.a文件由红色变成了黑色。右键show in finder能够在其目录下找到它。这就是咱们打包好的.a静态文件了。

 
打包好的.a静态文件

可是这样就完了吗?固然没有,咱们知道静态库存在的最大意义是隐藏代码的具体实现,可是这也隐藏的太完全了,总要公开些接口或者头文件供人调用吧。

四、公开接口头文件

targets->Build Phases->Copy Files->"+"你须要公开的头文件

这里咱们把新建的测试类StaticLibTool.h公开


 
公开接口头文件

公开头文件后,咱们再按上述一、二、3流程从新运行打包,咱们会获得一个头文件和一个.a静态库(以下图),而这正是咱们所须要的。

 
从新运行打包

五、新建一个可运行的工程,把这两个打包好的文件拖入项目测试

 
测试

选择Iphone7模拟器运行,程序正常运行,点击模拟器屏幕,打印日志以下:

 
日志输出

咱们能够看到输出没有问题,打包.a静态库大功告成。

可是,别高兴的太早。当我把模拟器切换成Iphone5运行时,编译直接不经过,报错以下:

 
iPhone 5模拟器运行时的编译错误

上图“Undefined symbols for architecture i386”是什么意思呢?意思是咱们的libStaticLib.a静态库不支持i386架构。那i386又是什么鬼?不清楚的能够拉上去看“iOS 设备的CPU架构”,这里就很少作解释了。

iPhone 5模拟器正好是i386架构,而咱们打包的静态库不支持。可是iPhone 7模拟器运行却没有问题,这说明咱们打包的静态库正好支持iPhone 7模拟器 的cpu架构 x86_64。如何查看静态库所支持的架构,请看下一步。

六、终端查看静态库所支持的架构

终端->cd进入库文件路径->lipo -info 库名


 
终端查看静态库所支持的架构

上图能够看到,咱们的静态库仅支持x86_64架构,也就是说此静态库只可运行在iphone5s-iphone7plus之间的模拟器设备。因此刚才咱们运行iphone5模拟器时,编译会报错。

到这里就能够进一步解释下,打包静态库时,你用什么模拟器运行,打包出来的静态库就支持什么模拟器的架构,而刚才我打包时是用iPhone7运行,因此仅支持架构x86_64。那么这就太麻烦了,能够打包一个静态库支持多种架构的模拟器吗?答案是确定的,请看下一步。

七、设置适配全部模拟器架构

project -> buildSeting -> Build Active Architecture Only 设为NO

 
设置适配全部模拟器架构

设置完成后,咱们从新运行打包静态库文件(这时你可随便选一个模拟器),按照上述第6步终端查看其支持的架构,咱们能够看到终端输出的结果是同时支持 i386和x86_64,这也就意味着同时支持全部模拟器。

到这里打包.a静态库已经告一段落,可是按上述流程打包的只能在模拟器上跑,真机是不能运行的,由于ios真机设备跟模拟器的架构又不同(怎么不同本身拉上去看),因此还没完(我也不想啊 ),请看下一步

八、打包支持真机架构的静态库

全部流程都跟上面的同样,只是咱们运行打包时要选择真机运行,以下图你能够选择本身插上去的真机,也能够选择Generic ios Devices。固然不要忘记了设置支持全部真机机型架构: Build Active Architecture Only 设为NO。


 
打包支持真机架构的静态库

咱们能够看下打包出来的终端查看结果以下:

 
终端输出结果

上图能够看到同时支持armv7和arm64,也就是支持全部ios设备。好了到此打包.a静态库算是告一段落。

  • .frameworke文件静态库打包

一、依然Xcode建立一个新的工程FrameworkeLib,选择工程以下:

 
建立一个新的工程

建立完成后咱们能够看到,工程自己自带一个FrameworkeLib.h文件,这是相似一个主头文件同样的东西

 
FrameworkeLib.h文件

二、建立须要测试的类,为了方便我把上述打包.a的测试类StaticLibTool直接拖来使用。

三、设置支持全部模拟器架构或真机架构(和打包.a第7步骤同样)

四、公开头文件

target-Build Phases - Headers -把须要公开的头文件从project拖入Public

 
暴露头文件

五、设置打包的是静态库。由于动态库也能够是以framework形式存在,因此须要设置,不然默认打出来的是动态库

target->BuildSetting ->搜索关键字mach->Mach-o Type 设为Static Library(这个默认选项是动态的)

 
设置打包的是静态库

六、选中真机或模拟器运行设备打包(与打包.a同样),完成后Products文件夹下的FrameworkeLib.framework文件由红色变成了黑色,右键show in finder 显示以下:

 
打包结果

FrameworkeLib.framework拖入项目即可直接使用,这里就再也不进行测试了。此外还要补充的一点是,打包静态库的时候还需注意打包的是测试版(Debug)仍是发布版(Release),这个根据你本身的需求决定,而如何进行设置请下一步骤。

七、设置打包静态库的测试版和发布版(.a和.frameworke)

product -> scheme -> Edit scheme -> Run->选择Debug或Release

 
相关文章
相关标签/搜索