iOS 创建静态库(.a)
2017-07-15 本文已影响0人
爱做梦的星星
静态库(.a)
文章类型: 学习笔记
1. 静态库简介
库的概念:
- 什么是库?
- 库 就是程序代码的集合, 是共享程序代码的一种方式.
- 库的分类:
- 1.开源库:公开源代码, 能看到具体实现,例如MJExtension, MJRefresh, AFNetworking...
- 2.闭源库:不公开源代码, 是经过编译后的二进制文件. 看不到具体实现.主要分为: `静态库` 和 `动态库`.
库的存在形式:
- 静态库的存在形式?
- `.a`和`.framework`
- 动态库的存在形式?
- `.dylib`(`.tbd`本质是一个描述文件,里面还是描述关联`.dylib`动态库的)和`.framework`
静态库和动态库的区别?
- 静态库在链接时, 会被完整的复制到可执行文件中, 被多次使用, 就有多份拷贝.
- 动态库则不会复制, 只有一份. 程序运行时动态加载到内存, 系统只加载一次, 多个程序共用, 节省内存.
- 注:
1.但是!!! 项目中如果使用到自己的动态库, 不允许上架!
2.再但是!!! WWDC2014上公布的 苹果对ios8开放动态加载dylib的接口 也就是说 开放了动态库挂载.
静态库应用场景
- 保护自己的核心代码
- 1. 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用
- 2. 例如:百度地图,友盟,JPush等
- 将MRC的项目,打包成静态库, 可以在ARC下直接使用, 不需要转换
- 提高工程的编译速度
静态库的特点?
.a
(.framework
) +.h
(头文件)
- 看不到具体实现的代码
2. 静态库的制作(.a)
创建一个.a
静态库
image_1bl2olid31pmffhn19214dpuqk1m.png-114.4kB
写个方法
+ (void)log;
+ (void)log {
NSLog(@"我是一个静态库");
}
编译成功后
image_1bl2oo4js1ifm48hcmu150l1crh23.png-89.4kBimage_1bl2ojs6l1bg61fkp1qst19iiqjr19.png-157.3kB
修改头文件目录目录
image_1bl2oq7ao1hi91630dhr16a63nv2s.png-135.6kB修改后编译结果
image_1bl2osllv1s7h12at1v5c1h019q33c.png-93.5kB测试
image_1bl2p2c971pn6s6usnauso4ar3p.png-247.1kB结果
1.使用6S模拟器进行测试, 通过
2.使用真机, 编译; 失败
3.使用低型号模拟器测试,; 失败
原因分析
1.模拟器下的静态库和真机下的静态库不能(各个模拟器型号之间架构也不一样)
2.主要原因是模拟器和真机CPU架构不一样
介绍架构
不同机型的CPU, 对应的架构不同;
模拟器: 4s----5 : i386 ;5s----7Plus : x86_64;
真机:3gs---4s : armv7 ;5/5c : armv7s(armv7兼容armv7s);5s---7Plus: arm64;
查看当前库的支持架构
lipo -info 库的路径
image_1bl2pjak5bkh1nk98ddsf1all4j.png-155.2kB
库支持的架构
image_1bl2pfajm10fu176k1ha81pk254g46.png-16.3kB只编译当前选中架构,需要改成No,编译所有的模拟器架构,如果你需要编译真机的所以库改成这个:
image_1bl2pllek1gc8ri4bjmm892ok50.png-135.5kB
image_1bl2pm4k211o219do1s511npi70t5d.png-21.1kB
image_1bl2pn74r1bts7nq1mu5l9b15nf5q.png-121kB
真机和模拟器2个库太麻烦,合成一个库
lipo -create + 一个库路径 + 另一个库路径 + -output +输出路径
image_1bl2q2k3q1q7u2ctjsf14k4q8967.png-106.8kB
合成特点
- 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
- 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
- 今后在使用.a时一定注意版本
将合成的拆开
//从其中一个架构抽出来
lipo -thin 架构名称 架构路径 -output 目标路径
//去除其中一个
lipo -remove 架构名称 架构路径 -output 目标路径
静态库的版本
- 1.调试版本
- 1.真机-Debug版本
- 2.模拟器-Debug版本
- 特点:
- 调试版本会包含完整的符号信息,以方便调试
- 调试版本不会对代码进行优化
- 2.发布版本
- 1.真机-Release版本
- 2.模拟器-Release版本
- 特点:
- 发布版本不会包含完整的符号信息
- 发布版本的执行代码是进行过优化的
- 发布版本的大小会比调试版本的略小
- 在执行速度方面,发布版本会更快些,但不意味着会有显著的提升
- 3.生产不同的版本
- 项目 -> Edit Scheme -> Run -> Release/Debug 分别进行编译