描述:
存在形式:静态库:. a .framework
动态库:. dylib .framework
区别:
静态库:链接时,静态库会被完整地复制到可执行文件中, 被多次使用就有多份冗余拷贝
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用, 系统只加载一次,多个程序共用,节省内存。
(注意: 项目中如果使用了自制的动态库,原则上是不能被上传到AppStore!)
制作大概过程
静态库:.a 制作过程1.创建过程中,选择“Cocoa Touch Static Library”
2.在过程中添加需要包含的代码
3.选择需要暴露出来的.h文件,.m文件会自动编译到.a文件中(选择 targets-->Build Phase--->Copy Files)
4.分别选择真机/模拟器设备,进行 Command+B 编译,生产相应的.a文件(位于当前Products文件夹)
备注:
a.真机生成的的用于真机设备上,模拟器生成的只能用于模拟器设备上,如若真机模拟器都可适用,需将真机与模拟器生成的进行合成
b.编译前debug/release设置问题。debug(真机/模拟器)版本用于debug版本,Release(真机/模拟器)版本用于发布版本
5.合成,终端输入命令 lipo -create 真机.a路径 模拟器.a路径 -output xx.a
(xx.a 是生成后的.a文件)
使用方式:
直接拷贝出其生成的.a文件与其.h文件,如有资源,需将资源做成bundle资源包
查看.a文件是模拟器还是真机类型,可通过终端命令进行查看
lipo –info xx.a
静态库:.framework 制作过程
1.创建过程中,选择“Cocoa Touch Framework”
2.同<.a 制作过程 步骤2>
3.暴露需要的头文件(选择 targets-->Build Phase--->Headers(public))
4.设置生成framework为静态库配置,默认是动态库( 选择targets-->Build Settings--->Linking---->Mach-O Type 设置为Static Library)
5.同<.a 制作过程 步骤4>
此时需要合并为framework中可执行文件
回头看一看,突然发现现在制作.framework库好幸福,记得两年前Xcode模版工程里没有iOS framework工程,采用Mac项目模板中framework工程,然后各种蛋疼的修改配置。。。。
注意事项
1.静态库中如果包含Category,使用静态库的工程中将会报“方法找不到”的错误(unrecognized selector sent to instance)
解决方案
在使用静态库的工程中配置 Other Linker Flags为-ObjC
2.静态库所支持的架构
i386:模拟器4s-5
x86_64:模拟器 5s-7Plus
armv7: 真机4s
armv7s(armv7兼容armv7s): 真机5,真机5c
arm64: 真机5s-7Plus
3.如何一次编译支持多个架构的的静态库?
正常情况下, 需要选中每一个模拟器进行编译, 生成支持对应架构的静态库. 然后合并;为了解决这种繁琐问题,需进行设置 Build Settings -> Build Active Architecture Only -> NO
4.查看一个framework库中可执行文件xx库是否为动态库
控制台: file framework库中可执行文件xx
控制台输出信息,直接看末尾:
Mach-O 64-bit dynamically linked shared library x86_64 (dynamically,动态库)
current ar archive random library(静态库)
lipo 其他的一些使用明
分解合成库
如一库中有多个架构,现只要i386架构库lipo -thin i386 xx -output xx
从合成库移除某个架构
如移除i386架构库
lipo -remove i386 xx -output xx