iOS開發(fā)中靜態(tài)庫(kù)(.a)制作
Xcode 9
一般iOS 開發(fā)者都會(huì)引用第三的庫(kù)
- 庫(kù)根據(jù)根據(jù)源代碼的公開情況 分為兩種
- 開源瀑志。如:MJRefresh看锉,AFNetworking
- 閉源东亦。又分為
靜態(tài)
蚣常、動(dòng)態(tài)
盒粮。
一疟丙、靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別:
靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)是相對(duì)編譯期和運(yùn)行期的余黎,靜態(tài)庫(kù)以.a
和 .framework
形式存在重窟,鏈接時(shí),靜態(tài)庫(kù)會(huì)被完整地復(fù)制到可執(zhí)行文件中惧财,被多次使用就有多份冗余拷貝巡扇;動(dòng)態(tài)庫(kù)以 .dylib
(iOS 7.0以前,iOS 8 之后.tbd
) 和 .framework 形式存在垮衷,鏈接時(shí)不復(fù)制厅翔,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用搀突,系統(tǒng)只加載一次刀闷,多個(gè)程序共用,節(jié)省內(nèi)存仰迁,一般只能由系統(tǒng)創(chuàng)建甸昏。
- 由于iOS 開發(fā)語言限制 。Swift 只支持 動(dòng)態(tài)庫(kù)(iOS 8.0 )徐许,OC ->
.a
(iOS 7.0).framework
(iOS 8.0)
二施蜜、靜態(tài)庫(kù)簡(jiǎn)介:
1、靜態(tài)庫(kù)分為真機(jī)—Debug(調(diào)試)版本雌隅、真機(jī)—Release(發(fā)布)版本翻默、模擬器—Debug版本缸沃、模擬器—Release版本;開發(fā)中一般都打包Release(發(fā)布)版本修械,將真機(jī)和模擬器版本合并趾牧,提供外界。
2肯污、使用場(chǎng)景:在項(xiàng)目開發(fā)的過程中翘单,例如兩個(gè)公司之間業(yè)務(wù)交流,不可能把源代碼都發(fā)送給另一個(gè)公司仇箱,這時(shí)候?qū)⑺矫軆?nèi)容打包成靜態(tài)庫(kù)奢讨,別人只能調(diào)用接口芯义,而不能知道其中實(shí)現(xiàn)的細(xì)節(jié)。
靜態(tài)庫(kù)(.a)
- 創(chuàng)建.a 靜態(tài)庫(kù)
創(chuàng)建工程 坯墨,選擇Cocoa Touch Static Library
創(chuàng)建.a
靜態(tài)庫(kù)
1.png
創(chuàng)建之后會(huì)默認(rèn)生成一個(gè)和庫(kù)名一樣的文件夾和 類(XCode 7 好像沒有生成類 需要自己手動(dòng)創(chuàng)建)
2.png
RMVersionToos.h
#import <Foundation/Foundation.h>
@interface RMVersionTool : NSObject
+ (NSString*)rm_getVersion;
@end
RMVersionTool.m
@implementation RMVersionTool
+ (NSString*)rm_getVersion {
return [NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"];
}
@end
2.編譯之后會(huì)生成.a
文件如下圖
別人用我們生成的庫(kù) 需要頭文件 這時(shí)我就就需要吧我的的
.h
文件暴露出去
- 第一種方式:直接把所有需要暴露的頭文件copy出去(不推薦)
-
第二種方式:用系統(tǒng)的CopyFile 添加對(duì)應(yīng)的文件夾包含所有的頭文件如下圖(個(gè)人推薦)
4.png -
第三種方式:用系統(tǒng)的header File 生成如下圖
6.png
7.png
第二種生成文件目錄5.png
第三種生成文件目錄8.png
- 測(cè)試
- 新建一個(gè)工程 属提,并導(dǎo)入剛才創(chuàng)建的.a 靜態(tài)庫(kù) 在
模擬器 IPhone 8
上測(cè)試可以 权逗,但是更換到模擬器iPhone 5
編譯報(bào)錯(cuò)如下9.png10.png
為什么呢冤议?
每一個(gè)設(shè)備都有自己的CPU架構(gòu)斟薇,每一個(gè)靜態(tài)庫(kù)也有自己支持的CPU架構(gòu)
對(duì)于iOS 模擬器- iPhone4s~5 : i386
- iPhone5s~8plus : x86_64
真機(jī) - iPhone 3gs ~ 4s : armv7
- iPhone5~5c: armv7s
- iPhone6~ : arm64
armv6, armv7, armv7s是ARM CPU的不同指令集,原則是向下兼容的恕酸。例如iPhone4S CPU支持armv7, 但它同時(shí)兼容armv6堪滨,只是使用armv6指令可能無法充分發(fā)揮它的特性。
查看靜態(tài)庫(kù)
.a
對(duì)處理器架構(gòu)的支持lipo -info xxx.a
-
解決不支持架構(gòu)-->>Build Active Architecture Only中的Debug如果為YES,就是說只能調(diào)試當(dāng)前活躍的架構(gòu),我們當(dāng)前選中的即是活躍的,所以設(shè)置為No即可
11.png
由于真機(jī)和模擬器架構(gòu)
不一樣 所以我們要分別針對(duì)模擬器
和真機(jī)
生成不同的.a
庫(kù)
真機(jī)生成 在真機(jī)下編譯 蕊温,模擬器生成在模擬器下編譯
最后會(huì)生成兩個(gè)靜態(tài)庫(kù)12.png 合并兩個(gè)靜態(tài)庫(kù) 終端命令:
lipo -create 靜態(tài)庫(kù)1名 靜態(tài)庫(kù)2名 -output 新靜態(tài)庫(kù)名稱