您的位置:首页 > 移动开发 > IOS开发

iOS静态库和动态库的介绍与制作

2017-03-13 19:36 232 查看
描述:

存在形式:

静态库:.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios iOS静态库