iOS 创建静态库(.a)

2017-07-15  本文已影响0人  爱做梦的星星

静态库(.a)

文章类型: 学习笔记


1. 静态库简介


库的概念:

  1. 什么是库?
- 库 就是程序代码的集合, 是共享程序代码的一种方式.
  1. 库的分类:
- 1.开源库:公开源代码, 能看到具体实现,例如MJExtension, MJRefresh, AFNetworking...
- 2.闭源库:不公开源代码, 是经过编译后的二进制文件. 看不到具体实现.主要分为: `静态库` 和 `动态库`.

库的存在形式:

  1. 静态库的存在形式?
- `.a`和`.framework`
  1. 动态库的存在形式?
- `.dylib`(`.tbd`本质是一个描述文件,里面还是描述关联`.dylib`动态库的)和`.framework`

静态库和动态库的区别?

  1. 静态库在链接时, 会被完整的复制到可执行文件中, 被多次使用, 就有多份拷贝.
  1. 动态库则不会复制, 只有一份. 程序运行时动态加载到内存, 系统只加载一次, 多个程序共用, 节省内存.

1.但是!!! 项目中如果使用到自己的动态库, 不允许上架!
2.再但是!!! WWDC2014上公布的 苹果对ios8开放动态加载dylib的接口 也就是说 开放了动态库挂载.


静态库应用场景

  1. 保护自己的核心代码
- 1. 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用
- 2. 例如:百度地图,友盟,JPush等
  1. 将MRC的项目,打包成静态库, 可以在ARC下直接使用, 不需要转换
  2. 提高工程的编译速度

静态库的特点?

  1. .a(.framework) + .h(头文件)
  1. 看不到具体实现的代码

2. 静态库的制作(.a)

创建一个.a静态库

image_1bl2olid31pmffhn19214dpuqk1m.png-114.4kBimage_1bl2olid31pmffhn19214dpuqk1m.png-114.4kB

写个方法

+ (void)log;

+ (void)log {
    NSLog(@"我是一个静态库");
}

编译成功后

image_1bl2oo4js1ifm48hcmu150l1crh23.png-89.4kBimage_1bl2oo4js1ifm48hcmu150l1crh23.png-89.4kB
image_1bl2ojs6l1bg61fkp1qst19iiqjr19.png-157.3kBimage_1bl2ojs6l1bg61fkp1qst19iiqjr19.png-157.3kB

修改头文件目录目录

image_1bl2oq7ao1hi91630dhr16a63nv2s.png-135.6kBimage_1bl2oq7ao1hi91630dhr16a63nv2s.png-135.6kB

修改后编译结果

image_1bl2osllv1s7h12at1v5c1h019q33c.png-93.5kBimage_1bl2osllv1s7h12at1v5c1h019q33c.png-93.5kB

测试

image_1bl2p2c971pn6s6usnauso4ar3p.png-247.1kBimage_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.2kBimage_1bl2pjak5bkh1nk98ddsf1all4j.png-155.2kB

库支持的架构

image_1bl2pfajm10fu176k1ha81pk254g46.png-16.3kBimage_1bl2pfajm10fu176k1ha81pk254g46.png-16.3kB

只编译当前选中架构,需要改成No,编译所有的模拟器架构,如果你需要编译真机的所以库改成这个:


image_1bl2pllek1gc8ri4bjmm892ok50.png-135.5kBimage_1bl2pllek1gc8ri4bjmm892ok50.png-135.5kB
image_1bl2pm4k211o219do1s511npi70t5d.png-21.1kBimage_1bl2pm4k211o219do1s511npi70t5d.png-21.1kB
image_1bl2pn74r1bts7nq1mu5l9b15nf5q.png-121kBimage_1bl2pn74r1bts7nq1mu5l9b15nf5q.png-121kB

真机和模拟器2个库太麻烦,合成一个库

lipo -create + 一个库路径 + 另一个库路径 + -output +输出路径
image_1bl2q2k3q1q7u2ctjsf14k4q8967.png-106.8kBimage_1bl2q2k3q1q7u2ctjsf14k4q8967.png-106.8kB

合成特点

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

将合成的拆开

//从其中一个架构抽出来
lipo -thin 架构名称 架构路径 -output 目标路径

//去除其中一个
lipo -remove  架构名称 架构路径 -output 目标路径

静态库的版本

上一篇下一篇

猜你喜欢

热点阅读