靜態(tài)庫(kù)有兩種形態(tài)
- .dylib
- .framework
.dylib的展示形式是一個(gè) xxxxx.a
禁炒,.a是一個(gè)純二進(jìn)制文件,.framework
中除了有二進(jìn)制文件之外還有資源文件xxxxx.bundle
霍比。
.a文件不能直接使用幕袱,需要搭配.h文件一起使用,而framework文件可以直接引用
靜態(tài)庫(kù)的作用是為了不暴露出比較重要的代碼模塊
建立項(xiàng)目
先創(chuàng)建一個(gè)項(xiàng)目悠瞬,選擇 Framework&Library
->Cocoa Touch Static Library
们豌,然后Next,如圖:
然后來(lái)到項(xiàng)目中浅妆,文件的大致結(jié)構(gòu)如下圖:
設(shè)置內(nèi)容
其中l(wèi)ibstatucLibrary.a就是我們要打包出來(lái)的靜態(tài)庫(kù)文件望迎,在.h寫(xiě)一個(gè)函數(shù)方法,在.m里面實(shí)現(xiàn)方法:
/**
在.h文件中暴露出來(lái)需要用到的方法
*/
+ (void)statucLibrary;
/**
在.m文件中實(shí)現(xiàn)
*/
+ (void)statucLibrary{
NSLog(@"打包一個(gè)測(cè)試靜態(tài)庫(kù)");
}
設(shè)置適配
此時(shí)libstatucLibrary.a文件還是紅色的凌外,因?yàn)槲覀冞€沒(méi)有編譯它辩尊,但是在編譯之前需要做一個(gè)適配,就是適配各個(gè)手機(jī)版本康辑,入項(xiàng)目中找到buildSeting
-> Build Active Architecture Only
設(shè)為NO
如果我們?cè)O(shè)置為YES摄欲,即為只編譯當(dāng)前architecture版本,這樣編譯的速度比較快速疮薇,但是拋棄了別的architecture版本胸墙,而設(shè)置為NO的時(shí)候,會(huì)默認(rèn)編譯所有版本
如果不配置會(huì)報(bào)錯(cuò) “Undefined symbols for architecture i386”
如圖:
設(shè)置頭文件.h
我們光導(dǎo)出了xxxxx.a文件還不夠按咒,因?yàn)槭褂?a文件需要搭配.h文件作為連接文件劳秋,所以我們需要配置一下.h文件,來(lái)targets
->Build Phases
->Copy Files
胖齐,設(shè)置自己的頭文件玻淑,將需要暴露出來(lái)的.h文件對(duì)應(yīng)的Code Sign On Copy下的選擇框勾選上
,如果找不到自己的頭文件,可以點(diǎn)擊+號(hào)來(lái)找到呀伙,如圖
運(yùn)行項(xiàng)目补履,生成.a文件
選擇一個(gè)模擬器,然后Run一下就可以看到libstatucLibrary.a變成了黑色的剿另,我們只需要Show in Finder
就可以看到文件所在箫锤,如圖:
打包一個(gè)真機(jī)靜態(tài)庫(kù)
這個(gè)是模擬器倒出來(lái)的靜態(tài)庫(kù),在真機(jī)運(yùn)行的時(shí)候是會(huì)報(bào)錯(cuò)Signing for "LibraryTest" requires a development team. Select a development team in the project editor.
雨女,是因?yàn)閷?dǎo)出來(lái)的靜態(tài)庫(kù)是模擬器的谚攒,我們還需要導(dǎo)出一個(gè)真機(jī)的靜態(tài)庫(kù),然后將兩個(gè)靜態(tài)庫(kù)合并氛堕,再此之前馏臭,我們需要再打包一個(gè)真機(jī)的靜態(tài)庫(kù),真機(jī)打包靜態(tài)庫(kù)在配置的地方和模擬器的沒(méi)有區(qū)別讼稚,但是在生成的時(shí)候不要選擇模擬器括儒,選擇Generic Device
绕沈,然后運(yùn)行項(xiàng)目,導(dǎo)出來(lái)的.a文件就是真機(jī)的文件
合并靜態(tài)庫(kù)
** 我們不可能在項(xiàng)目中導(dǎo)入兩個(gè)靜態(tài)庫(kù)或者在不同情況下替換不同靜態(tài)庫(kù)帮寻,所以需要合并兩個(gè)靜態(tài)庫(kù)乍狐,我們先生成模擬器靜態(tài)庫(kù)和真機(jī)靜態(tài)庫(kù),將xxxxx.a
文件都導(dǎo)出來(lái)固逗,放到兩個(gè)不同的文件夾中浅蚪,然后創(chuàng)建一個(gè)空的文件夾用來(lái)存放合并之后的xxxxx.a
文件 **
打開(kāi)終端,
輸入
lipo -create -output /Users/luweikeji/Desktop/通用/TestLibrary.a /Users/luweikeji/Desktop/模擬器/libstatucLibrary.a /Users/luweikeji/Desktop/真機(jī)/libstatucLibrary.a
-
lipo -create -output
是合并命令 -
/Users/luweikeji/Desktop/通用/TestLibrary.a
是我要存放的文件夾路徑烫罩,其中TestLibrary.a
是自己給合并之后的靜態(tài)庫(kù)取得名字 -
/Users/luweikeji/Desktop/模擬器/libstatucLibrary.a
這個(gè)是模擬器打包出來(lái)的靜態(tài)庫(kù) -
/Users/luweikeji/Desktop/真機(jī)/libstatucLibrary.a
這個(gè)是真機(jī)打包出來(lái)的靜態(tài)庫(kù)
導(dǎo)出來(lái)之后的掘鄙,我們?cè)偃我饽M器或者真機(jī)的.h文件拖入一個(gè)測(cè)試項(xiàng)目中,然后試用一下嗡髓,如圖: