iOS打包静态库(完整篇)

#链接:https://www.cnblogs.com/weiming4219/p/7827197.html

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文件实现如下

taticLibTool.m文件实现
3、运行工程进行打包

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

打包好的.a静态文件
但是这样就完了吗?当然没有,我们知道静态库存在的最大意义是隐藏代码的具体实现,但是这也隐藏的太彻底了,总要公开些接口或者头文件供人调用吧。

4、公开接口头文件

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

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

公开接口头文件
公开头文件后,我们再按上述1、2、3流程重新运行打包,我们会得到一个头文件和一个.a静态库(如下图),而这正是我们所需要的。

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

测试
选择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。如何查看静态库所支持的架构,请看下一步。

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文件,这是类似一个主头文件一样的东西

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 .framework/ .framework/ -output newname
少而好学,如日出之阳; 壮而好学,如日中之光; 老而好学,如炳烛之明[1]: http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference
[2]: https://mermaidjs.github.io/
[3]: https://mermaidjs.github.io/
[4]: http://adrai.github.io/flowchart.js/

iOS打包静态库(完整篇)相关推荐

  1. iOS架构-静态库.a打包之资源文件打包成bundle(4)

    iOS架构-静态库.a的打包及使用(一) iOS架构-静态库.a的脚本化打包及使用(二) 资源文件主要包括:xib.图片以及其他文件资源(json.string等).这里主要介绍 xib.图片.其他的 ...

  2. iOS架构-静态库.framework脚本化打包补充(5)

    静态库.framework脚本化打包打包已经在iOS架构-静态库.framework手动打包及脚本化打包(5)中讲过.这里补充是通过Xcode 配置Aggregate自动执行脚本打包Framework ...

  3. iOS架构-cocoapods打包静态库(依赖私有库、开源库、私有库又包含静态库)(14)

    前言: iOS工程架构少不了cocoapods 对第三方库的管理,它有着很好的操作性和集中管理的特性.之前的写了不少Xcode 建静态库工程打包.a 和 .framework 的文章,但是我们要先建静 ...

  4. iOS架构-静态库.framework之资源文件打包bundle(6)

    iOS架构-静态库.framework手动打包及脚本化打包(5)中介绍了.framework的脚本化打包,虽然在iOS架构-静态库.a打包之资源文件打包成bundle(4)中已经演示过,其实是一样的. ...

  5. iOS架构-静态库.framework手动打包及脚本化打包(5)

    引用一张博客的图片来理解下基本知识(http://www.cnblogs.com/oc-bowen/p/7478461.html) 我们可以看出.a的封装和.framework的封装差不多,也有模拟器 ...

  6. iOS架构-静态库.a的脚本化打包及使用(3)

    接着iOS架构-静态库.a的打包及使用(一)继续研究静态库.a的打包 需求背景: 手动编译静态库工程是会生成模拟器和真机两个不同的.a包 终端合成 $:lipo -create 真机.a路径 模拟器. ...

  7. iOS架构-静态库.a之依赖第三方静态库.a的制作(8)

    上一篇讲的是静态库.framework 依赖第三方库,是通过Cocoapod 提供的第三方库.而有时我们会依赖第三方.a 或者.framework 的.那么怎么样来制作依赖第三方.a 或者.frame ...

  8. iOS架构-静态库.a 和.framework的区别(0)

    原文网址:https://my.oschina.net/kaqijiang/blog/649632 一.什么是库? 库是共享程序代码的方式. 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存 ...

  9. iOS架构-静态库.framework之依赖第三方库(7)

    需求分析:     把自己的能力封装成静态库提供给客户使用,但是有些工作市场上已经有很好的公开的代码,或者成本很低的解决方案,我们就可以使用别人公开的.或者低成本采购的技术来为我们服务.制作静态库也是 ...

  10. IOS15打包静态库

    IOS15打包静态库 环境 xCode13.0 IOS 15 平台 我只用最新的软件. 新建一个静态库, 命名: TestStaticLib 语言我们选中OC 新建一个文件继承NSObject, To ...

最新文章

  1. Asp.Net MVC 4 Web API 中的安全认证-使用OAuth
  2. luogu P5292 [HNOI2019]校园旅行
  3. 考试 彩色 离散化+类暴力
  4. Bootstrap3 模态对话框的选项
  5. matlab对图像进行傅里叶变换_数字图像处理(一)—— 傅里叶变换
  6. javascript 不让成为nan_一张图彻底搞懂JavaScript的==运算
  7. 洛谷1056 排座椅 解题报告
  8. linux文件的三个主要的修改时间
  9. 使用Wireshark成功解决JavaWeb项目的页面一直加载中的问题
  10. linux下proc文件的读写(部分转载)
  11. 怎么配置php发送邮件环境,如何配置PHP发送电子邮件?
  12. 随机数和随机数种子——学不会找我
  13. 天黑时间跟经度还是纬度有关_时差的具体由来,时差由纬度还是经度决定?
  14. 用python画好看的图片,几张好看的HTML图片和利用Python画的好看的图
  15. nginx fastcgi_buffers设置
  16. Kruskal算法:将森林合并成树
  17. 刚刚,京东推出“小京鱼”平台和五款智能新品,全面押注IoT
  18. SSH和文件传输(SCP)
  19. win10 WmiPrvSE.exe WMI Provider 占用CPU过高的问题
  20. 克鲁斯卡尔算法(Kruskal)求最小生成树(MST)过程详解

热门文章

  1. 零基础云计算学习路线,到底什么是云计算?
  2. 自动化的机器学习:5个常用AutoML 框架介绍
  3. 又一程序员删库跑路被判刑,切勿冲动
  4. 抢票软件开发(三) 其余功能
  5. 声音莫名从扬声器切换到听筒_扬声器听筒的切换
  6. 计算机考研四门专业课是什么,2019计算机考研专业课复习问题答疑
  7. Windows10常用Windows自检方法
  8. 自己制作一个计时器、倒计时器
  9. iOS集成OpenCV,并实现图片马赛克
  10. 分布式集群中大数据的中位数