iOS 制作.a静态库
在实际的开发工作中, 很多时候我们希望别人在使用自己开发的功能时,看不到自己的核心代码。 这时候就要制作静态库了。
1. 明确几个概念:
- 库就是代码的集合。
- 静态库在链接时会被拷贝到可执行文件中。 有多个程序使用了该静态库, 手机系统中就会有多份该静态库源码。
- iOS中静态库的存在形式: .a 和 framework。
- .a+.h+资源 = framwork
2. 开始制作.a静态库
打开Xcode, 选择Framework&Library下的Cocoa Touch Static Library。
- 创建MySDK1工程,默认会有MySDK1.h和.m文件。
- 删除自动生成的文件,重新创建JYUtils.h和.m文件, 写入几个方法。
这里假设已经完成了代码层面的开发, 现在要将MySDK1编译成.a静态库。
- 选中Project-> MySDK1-> Info-> iOS Development Target, 选择8.0。(说明支持8.0以上系统)。
选中Targets-> MySDK1-> Build Settings->Build Active Architecture Only, 将Debug下的YES改为NO。(说明不仅仅构建当前活动的体系结构, 也就是构建所有的体系结构, 这个后面解释)
选中Targets-> MySDK1-> Build Phases-> Copy Files, 点击+号, 选择JYUtils.h(这里选择我们要暴露出去的.h文件)
Command+B编译工程(选择真机或者选择Generic iOS Device)。
- 选中Products文件夹下的libMySDK1.a, 右键 ShowInFinder, 会看到Debug-iphones文件夹, 该文件夹包含include文件夹和libMySDK1.a文件。
- 这时候已经制作出来.a静态库文件了。(不过有坑, 请往下看)
- 选中Products文件夹下的libMySDK1.a, 右键 ShowInFinder, 会看到Debug-iphones文件夹, 该文件夹包含include文件夹和libMySDK1.a文件。
3. 使用.a静态库
现在创建一个iOS工程UseMySDK1。
将上面生成的include文件夹和libMySDK1.a文件拖入到工程中。
在控制器中引入头文件(#import “JYUtils.h”), 使用JYUtils中的方法。
- 使用真机运行, 按照上面步骤下来, 应该可以在真机上运行了。
现在不使用真机, 使用任意模拟器, 编译没问题, 但是运行会发现报错了。
- 比如使用7模拟器, 报错信息如下:
- 不支持x86_64体系。
- 比如使用7模拟器, 报错信息如下:
这是为什么呢?
- 首先每一台iPhone真机设备都有自己的CPU。
- iPhone5s以后的设备CPU都是arm64。
- iPhone5s以前的设备CPU都是armv7和armv7s。
- iPhone模拟器使用的CPU:
- iPhone5s~iPhoneX模拟器使用的CPU都是x86_64。
- iPhone5s以前的模拟器使用的CPU都是i386。
现在我们在终端输入【lipo -info 静态库名称】, 会发现我们制作的静态库只支持armv7, arm64, 也就是说, 只支持真机, 不支持模拟器。
还记得一开始设置的Build Active Architecture Only 为 NO 吗?正是因为构建所有支持的体系结构, 所以会支持armv7(armv7也支持armv7s)和arm64。否则用iPhone5s以后的真机打出来的.a只支持arm64, 使用iPhone5s以前的真机打出来的.a只支持armv7(armv7s)。
- 首先每一台iPhone真机设备都有自己的CPU。
那么怎么同时支持真机和模拟器呢?
- 选中任意的模拟器。
- Command+B编译工程。
- 选中Products文件夹下的libMySDK1.a, 右键 ShowInFinder, 会看到Debug-iphonesimulator文件夹。
- 终端输入【lipo -info 静态库名称】,会看到该.a支持的CPU有i386, x86_64。也就是支持目前所有的模拟器。(这里也是因为Build Active Architecture Only设置为NO了, 否则用iPhone5s以前的模拟器打出来的.a只支持i386, iPhone5s以后的模拟器打出来的.a只支持x86_64)。
- 使用该.a会发现模拟器下可以运行, 真机运行报错。
- 现在既要支持真机, 又要支持模拟器, 那么就要合并两个.a。
- 在终端输入【lipo -create 真机静态库1 模拟器静态库2 -output 新静态库名】。
- 执行上述命令后会在当前文件目录下看到一个新的.a静态库。
- 终端输入【lipo -info 新静态库名称】,会看到该.a支持的CPU有i386, x86_64, armv7, arm64。也就是支持所有模拟器和真机设备了。
由于我们最终制作出来的.a静态库是要给第三方使用的, 而且会被上传AppStore。所以我们最终使用release模式下打出来的.a,而不是debug模式下打出来的.a。
- 选中小房子(MySDK1)->Edit Scheme,将Build Configuration 改为release即可。
- 同样使用真机和模拟器分别编译, 右键ShowInFinder。会看到多了Release-iphones和Release-iphonesimulator文件夹。我们使用这两个文件夹下的.a合并成支持i386, x86_64, armv7, arm64的.a。
- 收工。
- 选中小房子(MySDK1)->Edit Scheme,将Build Configuration 改为release即可。