iOS : 静态库制作
一.静态库简介
1. 什么是库?
库 就是程序代码的集合, 是共享程序代码的一种方式
2. 库的分类?
开源库
公开源代码, 能看到具体实现
例如MJExtension, MJRefresh, AFNetworking...
闭源库
不公开源代码, 是经过编译后的二进制文件, 看不到具体实现
主要分为: 静态库 和 动态库
3. 静态库的存在形式?
- .a
- .framework
4. 动态库的存在形式?
- .dylib
- .framework
5. 静态库和动态库的区别?
静态库在链接时, 会被完整的复制到可执行文件中; 被多次使用, 就有多份拷贝;
动态库则不会复制, 只有一份. 程序运行时动态加载到内存; 系统只加载一次, 多个程序共用, 节省内存;
但是!!!! 项目中如果使用到自己的动态库, 不允许上架!
- 再但是!!! WWDC2014上公布的 苹果对ios8开放动态加载dylib的接口 也就是说 开放了动态库挂载
6. 静态库应用场景?
保护自己的核心代码
国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用
例如:百度地图,友盟,JPush等
- 将MRC的项目,打包成静态库, 可以在ARC下直接使用, 不需要转换
7. 静态库的特点?
.a + .h
看不到具体实现的代码
二.静态库的制作(.a)
1.生成静态库大步骤
1. 创建项目时, 直接选择静态库(.a)
2. 设置需要暴漏的头文件
TARGETS -> Build Phases -> Copy Files
把需要暴漏的头文件添加进来即可
3. 在模拟器环境下编译(得到模拟器环境下的静态库)
选择模拟器6S,编译
4. 在真机环境下编译(得到真机环境下的静态库)
2.静态库使用测试
1.使用模拟器的静态库, 拖入测试工程
使用6S模拟器进行测试, 通过
使用真机, 编译; 失败
使用低型号模拟器测试,; 失败
2.测试结果分析
模拟器下的静态库和真机下的静态库不能共用
主要原因是模拟器和真机CPU架构不一样(各个模拟器型号之间架构也不一样)
3.注意静态库所支持的架构
不同机型的CPU, 对应的架构不同;
模拟器:
4s----5 : i386
5s----6sPlus : x86_64
真机:
3gs---4s : armv7
5/5c : armv7s(armv7兼容armv7s)
5s---6sPlus: arm64
4.查看静态库支持的架构
lipo -info 库文件
分别选中不同的模拟器, 进行编译, 查看不同的静态库支持架构
5.怎样一次编译支持多个架构的的静态库?
问题描述:
正常情况下, 需要选中每一个模拟器进行编译, 生成支持对应架构的静态库. 然后合并; 非常蛋疼
解决方案:
Build Settings -> Build Active -> NO
表示不止编译活跃的架构, 让所有的架构都编译
3.静态库文件的版本
1.调试版本
1.真机-Debug版本
2.模拟器-Debug版本
特点
- 调试版本会包含完整的符号信息,以方便调试
- 调试版本不会对代码进行优化
2.发布版本
1.真机-Release版本
2.模拟器-Release版本
特点
- 发布版本不会包含完整的符号信息
- 发布版本的执行代码是进行过优化的
- 发布版本的大小会比调试版本的略小
- 在执行速度方面,发布版本会更快些,但不意味着会有显著的提升
3.怎样生成不同版本?
项目 -> Edit Scheme -> Run -> Release/Debug 分别进行编译
4.如果想要一个静态库, 既可以在模拟器上运行, 也可以在真机上运行怎么做?
因为静态库针对于模拟器和真机生成了不同版本(支持不同架构), 所以没法同时运行
解决方案:
静态库的合并
检测.a的类型
$ lipo -info libCZTools.a
合并.a
lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a
特点
# 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
# 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
# 今后在使用.a时一定注意版本
三.静态库制作(.framework)
- 新建功能, 直接选择.framework静态库
编译时, 设置编译所有架构


默认制作的是动态库, 需要设置链接类型
target -> Build Settings-> 搜索 Mach-o Type ; 改为静态库


四.总结
1. 静态库打包的完整正确步骤!!
1. 确定是静态库
.a 的肯定是静态库
.framework的需要设置链接类型
target -> Build Settings-> 搜索 Mach-o Type ; 改为静态库


2. 确定支持模拟器或者真机中的所有架构
Build Settings -> Build Active -> NO
表示不止编译活跃的架构, 让所有的架构都编译
3. 提供的静态库应该是release版本
项目 -> Edit Scheme -> Run -> Release/Debug 分别进行编译
2. .a静态库和.framework静态库的区别?
1> .a是一个纯二进制文件, .framework中除了有二进制文件之外还有资源文件
2> .a文件不能直接使用, 至少要有.h文件的配合; .framework文件可以直接使用
3> .a + .h + sourceFile = .framework
4> 建议使用.framework
3. 静态库开发中的常见问题
问题1: 有些第三方库会使用到一些图片素材,例如公司的logo等。
由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,可能与使用静态库的程序冲突。
解决方案:
在静态库中如果要使用图片素材,会利用bundle的手段
1> 建立bundle,并且向其中添加图片
2> 创建一个类方法,返回图片
3> 编译
4> 调用方如果需要使用,需要导入 .h + .a + XXX.bundle
问题2:如果用户需要导入的头文件过多怎么加?
建议使用一个主头文件包含其他头文件, 让用户只导入一个主头文件
问题3: 静态库程序怎样测试?
静态库本身就是一个小项目, 实现某些功能, 但是这些功能在开发中也需要测试. 而测试代码又不能作为静态库的一部分
解决方案:
创建复合项目
4. 将MRC的项目,打包成静态库, 可以在ARC下直接使用, 不需要转换

5. 补充: swift动态库打包以及使用
注意: swift不支持静态库
想要暴漏接口出去, 学会使用public关键字
6.静态库(.framework)合并
http://www.cnblogs.com/KeenLeung/p/5491332.html
iOS : 静态库制作的更多相关文章
- iOS静态库.a文件制作和导入使用
iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Stat ...
- iOS静态库的制作与引用
[iOS静态库的制作与引用] 1.Configuring Exported Headers To configure which headers are exported to clients, se ...
- IOS静态库
如何在Xcode中创建C++静态库 http://jingyan.baidu.com/article/03b2f78c111fca5ea237ae26.html iOS 如何创建和使用静态库 http ...
- Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。
http://www.cocoachina.com/bbs/read.php?tid-282490.html Xcode6.1标准Framework静态库制作方法.工程转Framework,静态库加x ...
- iOS静态库转Framework动态库
参考文章: iOS静态库(.a 和framework) XCode6制作动态及静态Framework 说说iOS中静态库的开发 dyld: Library not loaded: @rpath/ ...
- iOS - 静态库的创建与使用
在日常项目开发中,不论是为了两个公司项目上的业务交流还是为了减少项目的编译时间,有的时候我们会把项目中的私密内容打包成静态库,或者是把项目中变动较少一部分打包成静态库以便提高编译效率,那么下面我们就来 ...
- 技巧:Linux 动态库与静态库制作及使用详解
技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 L ...
- iOS静态库 ---iOS-Apple苹果官方文档翻译
iOS静态库 ---iOS-Apple苹果官方文档翻译 •什么是库? 库是共享程序代码的方式,一般分为静态库和动态库.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使⽤用就为什 ...
- iOS 静态库,动态库与 Framework
iOS 静态库,动态库与 Framework 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢 ...
随机推荐
- IT书籍的选择与阅读
拍摄是一件艰苦而有趣的事情. 它需要眼睛和心灵完全融合投入, 需要耐心等待排除干扰, 需要敏捷捕捉稍纵即逝的瞬间. 但是, 非艰苦不成乐趣. 人生也应该选择一件有难度的事情来做. 做不成, 可以收获过 ...
- React笔记_(7)_react路由
路由 路由(routing)是指分组从源到目的地时,决定端到端路径的网络范围的进程. 路由器当然是作为一个转发设备出现的,主要是转发数据包来实现网络互联. 那么react的路由到底指的是什么呢? 举个 ...
- Linux 进程状态【转】
转自:http://www.cnblogs.com/itech/p/3208261.html 来自: http://blog.csdn.net/tianlesoftware/article/detai ...
- linux连接远程服务器提示拒绝访问
如上图,出现的问题是因为端口号错误,如果不是正常连接的端口号,那么就是端口号被恶意更改! 解决方案: 关掉或者开启需要的端口号注释!
- 有关对字符串的处理,需要用到List时的简化写法
这是项目中的需要根据ComputerName来获取IP的一个方法,如果出现多个ComputerName,需要将多个ComputerName的字符串以“:”分开,传进方法中,然后再处理不同的Name,然 ...
- HDU 3887:Counting Offspring(DFS序+树状数组)
http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意:给出一个有根树,问对于每一个节点它的子树中有多少个节点的值是小于它的. 思路:这题和那道苹果树是一样 ...
- Linux用户组与用户组基本命令
1.添加用户组:groupadd sexy2.修改组名:groupmod -n market sexy3.修改组编号:groupmod -g 668 market4.添加有编号的用户组:group - ...
- javascript 中==和===的区别
对于JavaScript中比较运算符,可能大家用的比较多的是“==”.对于“===”很多人可能很陌生.=== 表示恒等,首先比较两边的变量数据类型是否相等,其次比较两边的变量的数值是否相等:= ...
- 【转】Linus:利用二级指针删除单向链表
原文作者:陈皓 原文链接:http://coolshell.cn/articles/8990.html 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多, ...
- WP8.1简单项目 《在线词典》
为什么要做这个词典? 学了正则表达式要运用 增加WP开发熟练度 项目中运用了那些技术? HttpClient 正则表达式 数据绑定 详解 通过http://cn.bing.com/dict/searc ...
