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后面必須要指定具 體的文件。