静态库的存在形式
- .a 文件: 链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝
- .framework文件: 链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存.项目中如果使用了自制的动态库,不能被上传到AppStore,所以要修改为静态库.
制作步骤
1.新建工程,

2.新建测试文件Demolib.增加一个测试方法. 然后添加暴露头文件

3.编译
分别选择模拟器和真机编译,此时生成的为debug版本,然后选择release模式,分别在模拟器和真机编译,此时生成的为release版本. 点击工程products选中文件show in finder 看到编译成功的静态库

- 调试版本(Debug版本)和发布版本(Release版本)的区别
-
调试版本会包含完整的符号信息,以方便调试
-
调试版本不会对代码进行优化
-
发布版本不会包含完整的符号信息
-
发布版本的执行代码是进行过优化的
-
发布版本的大小会比调试版本的略小
-
在执行速度方面,发布版本会更快些,但不意味着会有显著的提升
-
所以合并静态库给同事使用的时候推荐为Release版本.
-
3.查看静态库所支持的平台
- 打开终端进入到该文件夹,使用
lipo -info libDemoLib.a
命令可以查看静态库所支持的平台

-
在这里有个模拟器和真机的CPU架构问题,不同的设备使用的CPU是不同的,CPU的不同造成使用的CPU架构(指令集)不同,如果静态库编译时使用的架构和在项目中编译工程时模拟器的架构不同,就会报错.由于使用的是xcode8,xcode默认没有iPhone4s模拟器,iPhone4s模拟器CPU架构为i386,如果使用xcode8以下的IDE编译静态库的话在Build Settings里面有个Build Active Architecture Only,默认为YES,需要改为NO,
- YES:表示制作的静态库只支持CPU架构为编译时选中模拟器CPU架构类型的平台,如果不一样编译工程的时候会报错.
- NO:表示让静态库支持所有的架构.
-
模拟器使用的CPU架构:
- iPhone4s-iPhone5 : i386
- iPhone5s-iPhone7plus : x86_64
-
真机使用的CPU架构:
- iPhone3gs-iPhone4s : armv7
- iPhone5-iPhone5c : armv7s
- iPhone5s-iPhone7plus : arm64
- 唯一特殊:只要支持armv7的静态库可以在armv7s上正常运行
-
使用iPhone5编译静态库,然后查看静态库支持的平台发现 i386和x86_64都支持.
3.合并静态库
使用命令lipo -create Release-iphoneos/libDemoLib.a Release-iphonesimulator/libDemoLib.a -output libDemoLib.a
. 合并之后既有好处也有坏处:
- 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
- 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
执行成功后新建文件夹将合并后的.a问价和头问价拖入,拖进项目,即可使用.
4.静态库中图片问题
有些第三方静态库中会使用一些logo图片或者其他的图片,但是由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,为了避免与使用静态库的程序冲突,在静态库中如果要使用图片素材,会使用bundle的手段
- 建立bundle,并且向其中添加图片
- 创建一个类方法,返回图片,然后编译
- 在导入静态库的时候头文件,静态库文件,bundle文件都需要导入
5.边开发边制作静态库
上述制作的静态库不方便调试.做好是边开发边制作静态库,方便调试.
-
新建测试工程如下:
#import "ViewController.h"
#import "DemoTest.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[DemoTest test];
}
@end
- 调试

- 编译打包

6.编译.framework静态库
- 创建项目,选择Framework

- 默认有一个主头文件,可以将其他头文件在该头文件中import一下

- 编写代码
- 编译库前,将头文件暴露出去

- 默认情况直接编译的库位动态库,可以修改配置改成静态库

- 选择模拟器和真机分别编译
网友评论