iOS打包静态库(完整篇)
1、 什么是库?
所谓库就是程序代码的集合,是共享程序代码的一种方式。
2、 库的分类
根据程序代码的开源情况,库可以分为两类
- 开源库
源代码是公开的,你可以看到具体实现。比如GitHub上比较出名的第三方框架AFNetworking、SDWebImage。 - 闭源库
不公开源代码,只公开调用的接口,看不到具体的实现,是一个编译后的二进制文件。这种常见于一些公司的SDK包,比如高德地图SDK、环信即时通讯SDK等等。而闭源库又分为两类:静态库和动态库。本篇重点要讲的便是其中的静态库。
3、静态库和动态库的存在形式和使用区别
存在形式:
- 静态库
以".a"或者“.framework”为文件后缀名 - 动态库
以".dylib"或者“.framework”为文件后缀名(Xcode7 之后 .tbd 代替了 .dylib)
使用区别:
- 静态库链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。
- 动态库链接时不复制,程序运行时由系统动态加载到内存,供程序调用。而且系统只加载一次,多个程序共用,节省内存。
4、iOS 设备的CPU架构
模拟器:
4s-5: i386
5s-iPhone X(包活iPhone SE): x86_64
真机(iOS设备):
armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)
armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2
armv7s: iPhone 5、iPhone 5c (静态库只要支持了armv7,就可以在armv7s的架构上运行)
arm64: iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPad Air、iPad Air2、iPad mini2、iPad mini3
注:iPhone 7、iPhone 7 Plus、iPhone 8、iPhone 8 Plus、iPhone X真机到底是什么架构暂时不得而知(太穷,买不起~ ~),但是模拟器是x86_64。
三、打包静态库
因为静态库存在两种形式,我们先看.a静态库的打包
- .a文件静态库打包
1、打开Xcode创建一个新的工程,这里以Xcode8为例,选择工程如下:
2、创建工程完毕后,再创建一个工具类StaticLibTool,添加一个方法用于测试
StaticLibTool.m文件实现如下
3、运行工程进行打包
运行完毕后,我们会看到工程中Products文件夹下的libStaticLib.a文件由红色变成了黑色。右键show in finder可以在其目录下找到它。这就是我们打包好的.a静态文件了。
但是这样就完了吗?当然没有,我们知道静态库存在的最大意义是隐藏代码的具体实现,但是这也隐藏的太彻底了,总要公开些接口或者头文件供人调用吧。
4、公开接口头文件
targets->Build Phases->Copy Files->"+"你需要公开的头文件
这里我们把新建的测试类StaticLibTool.h公开
公开头文件后,我们再按上述1、2、3流程重新运行打包,我们会得到一个头文件和一个.a静态库(如下图),而这正是我们所需要的。
5、新建一个可运行的工程,把这两个打包好的文件拖入项目测试
选择Iphone7模拟器运行,程序正常运行,点击模拟器屏幕,打印日志如下:
我们可以看到输出没有问题,打包.a静态库大功告成。
但是,别高兴的太早。当我把模拟器切换成Iphone5运行时,编译直接不通过,报错如下:
上图“Undefined symbols for architecture i386”是什么意思呢?意思是我们的libStaticLib.a静态库不支持i386架构。那i386又是什么鬼?不清楚的可以拉上去看“iOS 设备的CPU架构”,这里就不多做解释了。
iPhone 5模拟器正好是i386架构,而我们打包的静态库不支持。但是iPhone 7模拟器运行却没有问题,这说明我们打包的静态库正好支持iPhone 7模拟器 的cpu架构 x86_64。如何查看静态库所支持的架构,请看下一步。
6、终端查看静态库所支持的架构
终端->cd进入库文件路径->lipo -info 库名
上图可以看到,我们的静态库仅支持x86_64架构,也就是说此静态库只可运行在iphone5s-iphone7plus之间的模拟器设备。所以刚才我们运行iphone5模拟器时,编译会报错。
到这里就可以进一步解释下,打包静态库时,你用什么模拟器运行,打包出来的静态库就支持什么模拟器的架构,而刚才我打包时是用iPhone7运行,所以仅支持架构x86_64。那么这就太麻烦了,可以打包一个静态库支持多种架构的模拟器吗?答案是肯定的,请看下一步。
7、设置适配所有模拟器架构
project -> buildSeting -> Build Active Architecture Only 设为NO
设置完成后,我们重新运行打包静态库文件(这时你可随便选一个模拟器),按照上述第6步终端查看其支持的架构,我们可以看到终端输出的结果是同时支持 i386和x86_64,这也就意味着同时支持所有模拟器。
到这里打包.a静态库已经告一段落,但是按上述流程打包的只能在模拟器上跑,真机是不能运行的,因为ios真机设备跟模拟器的架构又不一样(怎么不一样自己拉上去看),所以还没完(我也不想啊 ),请看下一步
8、打包支持真机架构的静态库
所有流程都跟上面的一样,只是我们运行打包时要选择真机运行,如下图你可以选择自己插上去的真机,也可以选择Generic ios Devices。当然不要忘记了设置支持所有真机机型架构: Build Active Architecture Only 设为NO。
我们可以看下打包出来的终端查看结果如下:
上图可以看到同时支持armv7和arm64,也就是支持所有ios设备。好了到此打包.a静态库算是告一段落。
如果要同时支持模拟器和真机,请使用命令合成.a静态库:lipo -create name1.a所在路径 name2.a所在路径 -output newname.a
- .frameworke文件静态库打包
1、依然Xcode创建一个新的工程FrameworkeLib,选择工程如下:
创建完成后我们可以看到,工程本身自带一个FrameworkeLib.h文件,这是类似一个主头文件一样的东西
2、创建需要测试的类,为了方便我把上述打包.a的测试类StaticLibTool直接拖来使用。
3、设置支持所有模拟器架构或真机架构(和打包.a第7步骤一样)
4、公开头文件
target-Build Phases - Headers -把需要公开的头文件从project拖入Public
5、设置打包的是静态库。因为动态库也可以是以framework形式存在,所以需要设置,否则默认打出来的是动态库(注意:如果要上线AppSotre,一定要改成静态库,否则审核通不过)
target->BuildSetting ->搜索关键字mach->Mach-o Type 设为Static Library(这个默认选项是动态的)
6、选中真机或模拟器运行设备打包(与打包.a一样),完成后Products文件夹下的FrameworkeLib.framework文件由红色变成了黑色,右键show in finder 显示如下:
FrameworkeLib.framework拖入项目便可直接使用,这里就不再进行测试了。此外还要补充的一点是,打包静态库的时候还需注意打包的是测试版(Debug)还是发布版(Release),这个根据你自己的需求决定,而如何进行设置请下一步骤。
7、设置打包静态库的测试版和发布版(.a和.frameworke)
product -> scheme -> Edit scheme -> Run->选择Debug或Release

如果要同时支持模拟器和真机,和.a类似,请使用命令合成framework库:lipo -create <name1>.framework/<name1> <name2>.framework/<name2> -output newname
iOS打包静态库(完整篇)的更多相关文章
- ios打包静态库
1. 什么是库? 所谓库就是程序代码的集合,是共享程序代码的一种方式. 2. 库的分类 根据程序代码的开源情况,库可以分为两类 开源库源代码是公开的,你可以看到具体实现.比如GitHub上比较出名的第 ...
- iOS 打包静态库.a文件(真机版 + 虚拟机)
我们以打包IOS开发中封装的高地地图基础功能包 GDMap为例. 1>我们需要准备好需要打包的GDMap 2>接下来我们开始新建一个工程文件取名GDMap 3>删掉无 ...
- iOS开发——打包静态库与Framework
最近老是需要做接口给别的客户,就顺便把打包的过程也写一下吧! 一.静态库 静态图里面只能是纯文件,里面不能再有第三方打包的静态库,也就是说,静态库不能打包静态库.这个用的比较多,一般自己公司写出来的东 ...
- iOS 打包静态类库 lib.a
iOS 打包静态类库 lib.a 流程 1: xcode---新建项目---iOS-framework&Library-----Cocoa touch Static Library----Ne ...
- iOS基础 - 静态库
一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系 ...
- iOS 构建静态库
一..a 文件静态库打包 打开 Xcode 创建一个新的 Static Library 工程,取名 MyStaticLibrary. 创建工程完毕后,系统自动创建了一个同名类,添加一个方法用于测试. ...
- 手淘架构组最新实践 | iOS基于静态库插桩的⼆进制重排启动优化 抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 编译期插桩
抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 原创 Leo 字节跳动技术团队 2019-08-09 https://mp.weixin.qq.com/s/Drmmx5JtjG ...
- xcode6制作IOS .a静态库小记
xcode6制作IOS .a静态库小记 创建iOS静态库 简单写个打印的代码 编码完成之后,直接Run就能成功生成.a文件了,选择 xCode->Window->Organizer-> ...
- iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)
一.概念篇 什么是库? 库是程序代码的集合,是共享程序代码的一种方式 根据源代码的公开情况,库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking ...
随机推荐
- Jquery仿京东分类导航层简单实现
<script src="/js/jquery-1.11.1.min.js" type="text/javascript"></script& ...
- php 连接mysql数据库以及增删改查
php 连接数据库 一般是用面向对象的方法,需要先创建一个对象,即造一个连接对象,然后再写sql语句,(增改查删),最后执行sql语句 其中在创建连接对象时 我们用到的是MySQLI 是不区分大小写 ...
- 一款低延迟的分布式数据库同步系统--databus
每次看到马路对面摩托罗拉的大牌子,都想起谷歌125亿美元收购摩托罗拉移动,后来又以29亿美元卖给联想的事情.谷歌所做的决策都比较考虑长远利益,在这串交易中,谷歌获得了摩托罗拉最有价值的几千项专利,稳健 ...
- Mysql数据库导出数据字典文档Word或者HTML的3个工具
最近需要将Mysql的数据库导出一份Word的文档出来,本文记录调研后几个可用的工具和方法: 阿里云DMS工具导出 适用于存储在阿里云RDS服务中的Mysql数据库 导出格式支持:Word.Excel ...
- 恶意软件Mirai换了个马甲 瞄上我国2亿多台IoT设备
恶意软件Mirai换了个马甲 瞄上我国2亿多台IoT设备 想要起来时,一种沉重感阻碍着他,这是一种安全感:感觉到一张床为他铺好了,而且只属于他:想要静卧时,一种不安阻碍着他,把他从床上赶起来,这是 ...
- Nginx防盗链的3种方法
一:一般的防盗链如下: location ~* \.(gif|jpg|png|swf|flv)$ { valid_referers none blocked www.jzxue.com jzxue.c ...
- 浅谈Django的生命周期和CBF和FBC
Django的生命周期和CBF和FBC 对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端,客户端和服务端通信,字符串(Http协议):请求头和请求体 响应头+响应体 ...
- 【转】ATA Secure Erase
ATA Secure Erase This procedure describes how to use the hdparm command to issue a Secure Erase ...
- [Python] 文科生零基础学编程系列二——数据类型、变量、常量的基础概念
上一篇:[Python] 文科生零基础学编程系列--对象.集合.属性.方法的基本定义 下一篇: (仍先以最简单的Excel的VBA为例,语法与Python不同,但概念和逻辑需要理解透彻) p.p1 { ...
- Msys2配置总结
一.MSYS2的MirrorList配置 1.修改msys2安装目录下的/etc/pacman.d文件夹里面的3个mirrorlist.*文件 [mirrorlist.mingw32] #中国科学技术 ...