动态库与静态库的制作流程基本一样,包括头文件的暴露等,唯一不同的是Mach-O文件的编译形式。
1、这里要选Framework,如果选择右边的Static Library制作出来的是framework静态库。
导入所有要打包的文件。
2、将头文件公布出去,供外界使用,所有的编译文件都在Project中,需要右击添加到public里面
制作成功后 通常我们导入的头文件 就是 StaticFramework.h 例如:#import <StaticFramework/StaticFramework.h> , 所以:
可以在此文件下提前写入常用类的 头文件,比如AFNetworking.h 就可以写入进来。
4、link依赖的系统库。如:JSPath 的依赖框架有 libz.dylib
和 JavaScriptCore.framework
。
5、 选择Mach-O的编译方式,这一步决定我们制作出来的是静态库还是动态库,默认选择的是Dynamic Library,要手动选择Static Library。
(如果需要制作动态库,只需要将Mach-O的形式改为Dynamic Library就可以了,其他步骤一样)
6、Edit Scheme 改为release 快捷键 command + shift + <
7、 xcode 连上手机,选择真机设备,command + b 编译一下,然后Products 里面的framework 文件(真机状态编译后,由红变黑), show in finder 可以看到编译产生的包。
(模拟器和真机的framework是分开的,要分开制作。注意建议先选择真机,这样才会变色。
如果先选择模拟器,那么编译通过了,但是不会由红变黑,实际上是已经编译了模拟器的,只是给人一种假象,好像没编译一样,还是红色的。
我这里就是先编译模拟器,后编译了真机,结果没有红色变黑色)。
注: 编译前检查一下是debug模式还是release模式,选择release模式:
- 分debug和release模式:
- Debug-iphoneos 文件夹里面的东西是用在真机上的
- Debug-iphonesimulator 文件夹里面的东西是用在模拟器上的
- 如果 Scheme 是 Release 模式,生成的文件夹就以 Release 开头
然后 xcode 选择模拟器,重新 command + b 编译,
Products 里面的framework 文件 show in finder 可以看到编译产生的真机包 和 模拟器包
9、合并模拟器(release-iphonesimulator)和真机(release-iphoneos)下的framework,以便支持真机和模拟器,合并后的framework大小大约是不合并的2倍左右。
合并的命令:
格式: lipo -create 【模拟器打包path】 【真机打包path】 -output 【导出兼容版本path】 每个单词之间加空格
lipo -create /Users/mac/Desktop/dabao/Release-iphonesimulator/StaticFramework.framework/StaticFramework /Users/mac/Desktop/dabao/Release-iphoneos/StaticFramework.framework/StaticFramework -output /Users/mac/Desktop/dabao/StaticFramework
路径太长,下面有个简单的方式:(每一步记得要用空格隔开,不要遗漏了)
a1、新建文件夹:"dabao";
a2、将上述的release-iphonesimulator和release-iphoneos两个文件拷贝进"dabao"文件夹
a3、在终端输入:lipo -create
a4、将release-iphonesimulator下.framework 里面的 framework 拖进终端,输入一个空格;
a5、继续将release-iphoneos 下.framework 里面的 framework 拖进终端,输入空格
a6、继续输入:-output ,打个空格
a7、输入合并后的framework所要放的文件路径,这里举例依然放在“dabao”这个文件夹下,则我的电脑的路径为:
/Users/mac/Desktop/dabao/StaticFramework, 回车,在相应的文件下即可生成一个文件,该文件即是合并后的静态库.
10、合并完成后,可以把 模拟器(release-iphonesimulator)和真机(release-iphoneos)任意一个文件夹下的 .framework 中的 StaticFramework 替换一下,这个.framework 就可以使用了。
例如:模拟器下的静态库,用1 把 2 给替换掉, 3就是制作好的静态库。
到此 framework 库 就成功制作出了,此时只要将这个文件夹提供给外界使用就可以了。
使用时导入头文件: #import <StaticFramework/StaticFramework.h>
二、常见问题
如果你的依赖库里面有lib开头的dylib动态库,编译(command+b)时应该会报错。
问: 静态库中可以包含静态库?
答:静态库是没有办法融合静态库的,只能以依赖库的形式,静态库是不能真正的包含静态库的,它不像动态库,第三方静态库还需要以依赖库的形式提供给外界。动态库不存在这样的问题。
github 地址:https://github.com/lc081200/makeStaticFramework
【相关阅读】:
1、iOS 静态库——理论
2、iOS 静态库——framework制作
3、iOS 静态库——.a制作
参考链接:
http://www.jianshu.com/p/155a3cfb765e?utm_campaign=hugo