三、.framework
静态库的制作
- 3.1、创建项目时, 直接选择
.framework
静态库
3.2、创建一个继承于NSObject
的JKTest
类,并写一个类方法,把该类的.h文件暴露出来
提示:记得把需要暴露的 .h
文件导入到在创建静态库的时候生成的 .h
文件里面,如上面的 JKOCProjectTool.h
3.3、利用上面2.6
的方案二
生成发布版本的静态库,记得修改支持的最低版本,修改 把.framework
的库由动态库改为静态库
// 1.cd 进入静态库项目 cd JKOCProjectTool // 2.使用xcodebuild生成静Release下真机的静态库 xcodebuild -target JKOCProjectTool -configuration Release -sdk iphoneos -arch armv7 -arch arm64 // 3.使用xcodebuild生成静Release下模拟器的静态库 xcodebuild -target JKOCProjectTool -configuration Release -sdk iphonesimulator -arch i386 -arch x86_64
使用xcodebuild生成静Release下模拟器的静态库
提示:你如果需要
Debug
下的静态库,参照2.6
自行生成
- 3.4、测试一下是否可以运行(提示:如果不把动态库改为静态库会运行报错,如果你想强行使用动态库,那么你就在:
TARGETS
->General
->Embedded Binaries
添加你的库)
测试OK
- 3.5、合并
.framework
静态库
合并静态库
lipo -create 真机的JKOCProjectTools路径 模拟器的JKOCProjectTools路径 -output 合并后的JKOCProjectTools文件
切记:合成的是二进制文件而不是framework,最后合成的二进制文件替代之前的二进制文件即可
- 3.6、补充:静态库操作
- <1>、合成不同架构的库(也就是上面的
3.5
)
lipo -create xx xx -output xxx
- <2>、分解合成库
lipo -thin 架构名称 xx -output xx
- <3>、测试静态库 所支持的架构
cd 进入 静态库所在的文件夹 lipo -info 库文件名
- <4>、从合成库移除某个架构
lipo -remove 架构名称 xx -output xx
提示:上面3.6中的
xx
代表静态库名
四、总结
- 4.1、静态库打包的完整正确步骤
- <1>、确定是静态库
.a
的肯定是静态库.framework
的需要设置链接类型,project
->Build Settings
-> 搜索Mach-o Type
; 改为静态库选择Static Library
`.framework`的需要设置链接类型
- <2>、确定支持模拟器或者真机中的所有架构
- 如果使用的2.6类里面的 方案一 那就是xcode要支持所有的架构的模拟器,并且修改 Build Settings ->Build Active ->NO,这样编译之后,debug真机下支持debug真机下所有的架构,debug模拟器下支持debug模拟器下所有的架构
- 如果使用的2.6类里面的 方案二
xcodebuild
方法就可以支持所有的架构
- <3>、提供的静态库应该是
release版本
- 如果使用的2.6类里面的 方案一:项目 -> Edit Scheme -> Run -> Release/Debug 分别进行编译
- 如果使用的2.6类里面的 方案二
xcodebuild
方法,在命令类里面输入 Release 就好
- 4.2、
.a静态库
和.framework静态库
的区别?
- <1>、
.a
是一个纯二进制文件,.framework
中除了有二进制文件之外还有资源文件,.bundle
就是资源文件 - <2>、
.a
文件不能直接使用, 至少要有.h文件的配合;.framework
文件可以直接使用 - <3>、
.a
+.h
+sourceFile
=.framework
- <4>、建议使用
.framework
- 4.3、静态库开发中的常见问题
- 问题1: 有些第三方库会使用到一些图片素材,例如公司的logo,xib文件等,如何做?
答:创建一个.bundle
文件,创建方式看 资源文件 .buldle 的添加第十。 - 问题2: 如果用户需要导入的头文件过多怎么加?
答:在创建.framework
项目会默认生成一个.h
文件,我们可以把其他的.h
文件导入 默认生成一个.h
文件 中 - 问题3: 静态库程序怎样测试?
答:创建一个创建复合项目,看下面4.4
创建的步骤
- 4.4、创建一个创建复合项目(符合工程的名字定义为:
复合项目
)
- <1>、在复合项目中添加一个
.framework
的静态库JKTools
在复合项目中添加一个`.framework`的静态库`JKTools`
- <2>、创建一个
JKTest
类,创建一个类方法,并把JKTest的.h
放到创建静态库生成的.h
文件里面
创建一个`JKTest`类,创建一个类方法
把JKTest的`.h`放到创建静态库生成的`.h`文件里面 - <3>、选中
JKTools
,修改下面选项
修改JKTools支持的最低版本为9.0,看自己项目了
设置为静态库
修改 Build Settings ->Build Active ->NO,这样编译之后,debug真机下支持debug真机下所有的架构,debug模拟器下支持debug模拟器下所有的架构
把需要暴露的文件放到Public里面 - <4>、在复合项目添加我们的静态库依赖
在符合项目添加我们的静态库依赖 - <5>、测试
导入#import <JKTools/JKTools.h>
,调用下面的方法
[JKTest jk_test];
- 打印结果:
复合项目的测试
- <6>、有关
.framework
的文件导出,我就不再重复了,也就是上面2.6
的步骤,有关合上面也有讲述
五、将MRC的项目,打包成静态库, 可以在ARC下直接使用, 不需要转换
- 5.1、应用场景
你找到一个功能是ARC项目下的,你想用,里面有很多的类,你怎么把他们搬到ARC项目下使用???
- 5.2、解决方案一(适用于类不太的情况)
- <1>、我们模拟一个类JKTools,它是MRC下的项目
我们模拟一个类JKTools,它是MRC下的项目 - <2>、我们把JKTools的.h与.m拖到ARC的工程下,报错是肯定的,我们看下如何处理。如下图
在ARC图中路径找到MRC下的.m文件,双击输入-fno-objc-arc
提示:在ARC图中路径找到
MRC
下的.m
文件,双击输入-fno-objc-arc
,再运行就不会报错了
- 5.3、解决方案二(适用于MRC的类很多的情况):把MRC下的类打包成静态库,
.a
或者.framework
都可以,下面以打包成.framework
为例,步骤如下
- <1>、创建一个
.framework
项目,这里名字一JKTools
为例,把上面JKTools.h
和JKTools.m
拖进去,把并修改项目为MRC
修改项目为MRC
在TARGETS->Build Settings
下搜Automatic Reference
,改为 NO;其中YES为ARC,NO为MRC。 - <2>、重复
4.4
里面<3>
的步骤 - <3>、生成发布版本的静态库以及合并真机与模拟器的二进制文件,最后把合并的二进制文件替换掉 真机下
framework
里面的二进制文件 - <4>、把framework拖入 ARC的项目,直接导入framework里面的.h文件查看是否可以,经过测试时OK的,不懂的你可以联系我
五、Swift打包动态库
- 5.1、创建一个
Swift
下的.framework
工程,命名为JKTools
,同时创建一个类JKTest
,写一个方法jk_test
创建一个`Swift` 下的 `.framework` 工程,命名为 `JKTools` ,同时创建一个类`JKTest`,写一个方法 `jk_test` - 5.2、把支持的最低版本调为 9.0,具体的看自己项目
把支持的最低版本调为 9.0,具体的看自己项目 - 5.3、修改 Build Settings ->Build Active ->NO,这样编译之后,debug真机下支持debug真机下所有的架构,debug模拟器下支持debug模拟器下所有的架构
- 5.4、修改 为静态库
修改 为静态库 - 5.5、在release下编译模拟器与真机,生成像一个的.framework 文件,把类里面的二进制文件合并成一个,步骤和上面一样,不再重复了
- 5.6、测试静态库的使用,结果显示是OK的
测试静态库的使用,结果显示是OK的
到此,静态库的相关知识记录到这,相比较其他的博客还是比较详细的。遇到任何问题都可以再我的个人信息里面来联系我