.a靜態(tài)庫的制作及使用


1.創(chuàng)建靜態(tài)庫工程,工程命名為BaseSDK,生成的.a文件名變成libBaseSDK。

2.刪掉自動生成的文件BaseSDK.h? BaseSDK.m

3.添加你的實用類文件

4.添加Headers Phase

5.將暴露給外面用的頭文件加入進來,加進來后要移到public中去(不移到public中也沒錯,只是下面第11步中不會出現(xiàn).h文件,需要從庫的源碼中找)

6.然后設置編譯模式,打開Xcode菜單Product--->Scheme--->Edit Scheme,改為release模式,因為最終打包是要用release模式

7.設置Build Active Architecture Only

模擬器:iPhone4s~5 : i386 iPhone5s~6plus : x86_64

真機:iPhone3gs~4s : armv7 iPhone5~5c : armv7s iPhone5s~6plus : arm64

如果Build Active Architecture Only設置為YES,那么編譯出來的.a靜態(tài)庫就只包含當前設備的指令集。

舉個例子:如果我們選擇iPhone 5模擬器編譯,則編譯出來的.a靜態(tài)庫只能用iPhone4s~5模擬器跑程序,用iPhone5s~6plus,則會報找不到x86_64的APPBaseSDK庫。

設置為NO,則會把所有指令集的都打包合并。因此靜態(tài)庫有個缺點就是靜態(tài)庫包比源碼大很多。

8.設置最低支持版本

9.編譯生成靜態(tài)庫

編譯時,需要用模擬器和真機各編譯一次,這樣Products目錄下的libBaseSDK.a靜態(tài)庫才會變?yōu)楹谏?,右鍵show in Finder,可以進入Products目錄下。

10.合并模擬器和真機靜態(tài)庫文件libBaseSDK.a,打開終端命令如下

lipo -create /Users/zhanglinfeng/Library/Developer/Xcode/DerivedData/BaseSDK-cexmrzesjuswutaldkedwjpnpxnk/Build/Products/Release-iphoneos/libBaseSDK.a /Users/zhanglinfeng/Library/Developer/Xcode/DerivedData/BaseSDK-cexmrzesjuswutaldkedwjpnpxnk/Build/Products/Release-iphonesimulator/libBaseSDK.a -output /Users/zhanglinfeng/Desktop/libBaseSDK.a

11.使用.a靜態(tài)庫

將靜態(tài)庫拖入新建的工程,我這里拖到下圖箭頭所指的UseA文件夾下(如果你要拖到其他目錄,就要改Library Search Paths,后面我會介紹Library Search Paths路徑相關知識),再將暴露給外面用的.h文件也拖入工程,

注意:如果沒有include里的.h文件.那就從庫的源碼中挑出一些需要暴露的.h文件。

導入頭文件就可以使用了,如下圖

注意:如果要用到靜態(tài)庫中的category方法,需要設置Other Linker Flags為-ObjC(注 意大小寫,有些資料里大小寫搞錯了坑死我了)。引入了-ObjC標志,它的作用就是將靜態(tài)庫中所有的和對象相關的文件都加載進來本來這樣就可以解決問題 了,不過在64位的Mac系統(tǒng)或者iOS系統(tǒng)下,鏈接器有一個 bug,會導致只包含有類別的靜態(tài)庫無法使用-ObjC標志來加載文件。變通方法是使用-all_load 或者-force_load標志,它們的作用都是加載靜態(tài)庫中所有文件,不過all_load作用于所有的庫,而-force_load后面必須要指定具 體的文件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容