静态库学习(一)

2020-04-15  本文已影响0人  冷武橘

一、概述
库就是程序代码的集合 是共享程序代码的一种方式;根据公开和不公开可分为:开源库和闭源库;我们经常使用的第三库像MJExtension、MJrefrsh、SDWebImge等都属于开源库;而闭源库是经过编译后的二进制代码,我们无法看到具体实现,比如说经常使用的百度SDk等。闭源库又可分为:静态库、动态库。

二、静态库和动态库的区别

静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝。文件后缀:.a或者.framework

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。文件后缀:.dylib或者.framework

注意:如果项目中使用自制的动态库,不能上传到appstore中,因此开发中使用的基本都是静态库。

三、Architectures (架构)
之所以提到CPU架构的问题,其实是因为我们iOS开发使用的静态库与动态库与之紧密相连。每一个开发的App都要运行在模拟器或者真机上,在编译的时候,Xcode需要去分析当前运行平台的CPU架构,然后确定所使用的静态库是否支持这个CPU架构。如果不支持就会报错。

"CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。目前市面上的CPU分类主要分有两大阵营,一个是intel、AMD为首的复杂指令集CPU,另一个是以IBM、ARM为首的精简指令集CPU。两个不同品牌的CPU,其产品的架构也不相同,例如,Intel、AMD的CPU是X86架构的,而IBM公司的CPU是PowerPC架构,ARM公司是ARM架构"(摘自百度)
通常,我们知道电脑的CPU架构有X86和X64等,但是手机的主流CPU架构是ARM架构,因为采用ARM架构的CPU是一种微处理器,这种处理器功耗低,体积小,更适合手机使用,iPhone的CPU也是如此。

  1. Architectures
    指定工程被编译成可支持哪些指令集类型,而支持的指令集越多,就会编译出包含多个指令集代码的数据包,对应生成二进制包就越大,也就是ipa包会变大。

2.Valid Architectures
限制可能被支持的指令集的范围,也就是Xcode编译出来的二进制包类型最终从这些类型产生,<b>而编译出哪种指令集的包,将由Architectures与Valid Architectures(因此这个不能为空)的交集来确定

  1. Build Active Architecture Only
    指定是否只对当前连接设备所支持的指令集编译
    当其值设置为YES,这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本,而设置为no时,会编译所有的版本。 所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。
1244124-664cd726a222f057.png
  1. 选择Coca Touch stair Libary点击next创建一个工程。

2.新建一个工具类


屏幕快照 2018-01-28 上午10.07.23.png

3.暴漏头文件
TAGETS -> Build Phases ->Copy Files 添加头文件Tool.h


屏幕快照 2018-01-28 上午10.11.03.png
  1. 支持所有模拟器的cpu架构


    屏幕快照 2018-01-28 上午10.55.02.png
  2. Command +B编译一下


    屏幕快照 2018-01-28 上午10.15.28.png
屏幕快照 2018-01-28 上午10.18.54.png
屏幕快照 2018-01-28 上午11.03.44.png

6.生成支持真机的静态库


屏幕快照 2018-01-28 下午3.11.12.png

连接上iphone设备Command +B编译一下


屏幕快照 2018-01-28 下午3.13.54.png

总结:在编译静态库时,需要编译两个版本 -> 真机iphones版本(arm) | 模拟器和iphonesimulator版本(i386);
终端命令静态库支持的架构:lipo -info liblibstatic.a

五、静态库合并
在开发过程为了让静态库同时支持真机和模拟器方便调试,我们需要将iphones版本和iphonesimulator版本合并成一个静态库,既能支持模拟器,又能支持真机。


屏幕快照 2018-01-28 下午3.20.41.png

lipo -create 静态库1 静态库2 -output 新的静态库

终端命令: 屏幕快照 2018-01-28 下午3.34.34.png
lipo  -create Debug-iphoneos/liblibsttt.a Debug-iphonesimulator/liblibsttt.a -output libTools.a

 llipo -info libTools.a

Architectures in the fat file: libTools.a are: armv7 i386 x86_64 arm64 

合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的

静态库Realese版本生成:
Edit Scheme ->Run->Build Configuration->Release


屏幕快照 2018-01-28 下午3.49.42.png 屏幕快照 2018-01-28 下午3.50.06.png

静态库文件的版本(4种)


屏幕快照 2018-01-28 下午3.42.08.png

调试版本会包含完整的符号信息,以方便调试;
调试版本不会对代码进行优化;

发布版本不会包含完整的符号信息;
发布版本的执行代码是进行过优化的;
发布版本的大小会比调试版本的略小;
在执行速度方面,发布版本会更快些,但不意味着会有显著的提升;

上一篇 下一篇

猜你喜欢

热点阅读