美文网首页
静态库学习(一)

静态库学习(一)

作者: 冷武橘 | 来源:发表于2020-04-15 16:42 被阅读0次

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

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

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

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

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

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

  • 1、什么是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也是如此。

  • 2 、常见的架构
    armv7|armv7s|arm64都是ARM处理器的指令集;
    i386|x86_64 是Mac处理器的指令集。
    iOS模拟器没有运行ARM指令集,编译运行的是x86指令集(或i386),所以只有在iOS设备上才会执行设备对应ARM指令集。每个设备都有属于自己的CPU架构。


    屏幕快照 2018-01-27 下午9.42.52.png
  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
  • 3终端命令查看静态库支持的架构:
    lipo -info xxxxxx.a (切换到.a的父文件夹下执行)

    lipo -info HisignFaceBaseSdk(切换到HignFaceBaseSdk的父文件夹下即HisignFaceBaseSdk.framework文件下,其实framework就是个文件夹)
    四、静态库的制作


    屏幕快照 2018-01-28 上午10.01.51.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

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

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

相关文章

  • iOS 创建静态库(.a)

    静态库(.a) 文章类型: 学习笔记 1. 静态库简介 库的概念: 什么是库? 库的分类: 库的存在形式: 静态库...

  • iOS 创建静态库(.framework)

    静态库(.framework) 文章类型: 学习笔记 关于静态库的简介说明请看iOS 创建静态库(.a) 创建一个...

  • 创建静态库

    iOS深入学习(创建静态库static library) 库包含静态库和动态链接库,他们之间区别是:静态库可以编译...

  • 静态库学习(一)

    一、概述库就是程序代码的集合 是共享程序代码的一种方式;根据公开和不公开可分为:开源库和闭源库;我们经常使用的第三...

  • 静态库学习(一)

    一、概述库就是程序代码的集合 是共享程序代码的一种方式;根据公开和不公开可分为:开源库和闭源库;我们经常使用的第三...

  • iOS学习笔记-封装含静态库的动态库

    iOS学习笔记-封装含静态库的动态库

  • 目录一、库二、静态库、动态库、Framework三、打包静态库 1、.a静态库和.framework静态库的区别 ...

  • 静态库

    目录 静态库 静态库的创建 静态库的使用 一、静态库的创建 方式一(.a): 1、创建project ,new p...

  • Ndk生成so和a库,然后主项目进行调用

    在 NDK 开发中引入第三方静态库和动态库 静态库和动态库 静态库 静态库文件后缀一般为 .a ,利用静态库编译成...

  • iOS静态库之间互调冲突问题

    研究目的 1. 在其他静态库(B静态库)中导入公共静态库(A静态库),想直接使用公共静态库(A静态库)中的方法和m...

网友评论

      本文标题:静态库学习(一)

      本文链接:https://www.haomeiwen.com/subject/fuacvhtx.html