一.基础概念
1.从开源角度讲,常见库的种类可以分为开源库和闭源库,iOS中静态库和动态库都属于闭源库,常见的AFN,MJExtension属于开源库。
2.静态库和动态库的文件后缀
- 静态库:以.a 和 .framework为文件后缀名。
- 动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名。
3.静态库和动态库的区别
- 静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。
- 动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内存。
4.iOS设备架构
- 模拟器:
iPhone4s-iPnone5:i386
iPhone5s-:x86_64 - 真机设备
iPhone3gs-iPhone4s:armv7
iPhone5-iPhone5c:armv7s
iPhone5s-:arm64
二.静态库打包
.a静态库文件打包
1.创建文件
1.png此时.a文件是红色状态
2.png
2.创建新文件之后,把头文件暴露给外部使用
3.png3.修改配置文件并编译
我们需要把Build Active Architecture Only修改为NO,否则生成的静态库就只支持当前选择设备的架构。
4.png
我们分别选择Generic iOS Device和任意一个模拟器各编译一次,编译完后,我们会看到工程中Products文件夹下的libTest.a由红色变成了黑色,然后show in finder,看看生成的文件。
5.png
此时生成Debug-iphoneos/libTools.a和Debug-iphonesimulator/libTools.a两个.a文件,一个是模拟器架构下使用的,一个是真机架构环境下使用的。但都是Debug版本的。
如果想使用Release版本的:
6.png
选择Release并且再次编译。(Release版本比Debug版本运行速度更快,更轻量级)
4.验证.a文件支持的架构环境并合并
- 验证:
lipo -info 静态库名字
验证静态库支持的架构 - 合并:
lipo -create 第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径
把模拟器环境和真机环境的.a文件合并成一个.a文件
8.png
把.a文件和头文件集添加进入项目就可以使用。
5.打包前调试
因为静态库只能编译,那么我们如何调试代码呢?
A.新建一个普通工程
B.添加一个.a静态库的TARGETS(配置和编译步骤同上)-图1
C.主工程TARGETS关联静态库-图2、3
1.png
D.引入头文件进行调试
1.png
.framework静态库文件打包
1.创建文件
1.png此时.framework文件是红色状态
2.png
2.创建新文件后,把头文件暴露给外部使用
3.png3.修改配置文件并编译
我们需要把Build Active Architecture Only修改为NO,否则生成的静态库就只支持当前选择设备的架构。
4.png
我们分别选择Generic iOS Device和任意一个模拟器各编译一次,编译完后,我们会看到工程中Products文件夹下的TestFramework.framework由红色变成了黑色。
把Mach-O文件修改为静态库类型(因为.framework类型可为动态库也可为静态库)
5.png
此时生成Debug-iphoneos/TestFramework.framework和Debug-iphonesimulator/TestFramework.framework两个.framework文件,一个是模拟器架构下使用的,一个是真机架构环境下使用的。但都是Debug版本的。
如果想使用Release版本的:
6.png
选择Release并且再次编译。(Release版本比Debug版本运行速度更快,更轻量级)
4.验证.a文件支持的架构环境并合并
- 验证:
lipo -info 静态库名字
验证静态库支持的架构 - 合并:
lipo -create 第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径
eg:lipo -create /Users/zhousiyang/Desktop/liba/ToolFramework.framework/ToolFramework /Users/zhousiyang/Desktop/liba/ToolFramework2.framework/ToolFramework -output /Users/zhousiyang/Desktop/liba/final
把模拟器环境和真机环境的.framework文件合并成一个.framework文件
6.png
替换任意一个内部的.framework文件然后导出使用
5.打包前调试(同.a文件)
6.静态库.a和.framework的区别
.a文件只是单纯的二进制文件(代码),而.framework可以包含资源文件(图片音视频-建议使用Bundle包装避免和外部重名)。
网友评论