標籤:iphone5 develop strong xcode gem -objc 通用 多次 編譯配置
建立.a靜態庫
第一步,建立工程。
一般使用工程名就使用庫的名稱,比如我這裡用FMDB來建立靜態庫,我的工程名就取名為FMDB,建立的.a靜態庫就是libFMDB.a。
使用靜態庫模板建立工程.png
建立的工程.png
第二步,刪除系統預設建立的【FMDB.h】和【FMDB.m】檔案,匯入需要打包的源檔案。
匯入源檔案後.png
第三步(方式一),修改項目配置
修改配置.png
點擊中的【3】,彈出的列表中選擇【New Headers Phase】,開啟【Headers (0 items)】,點擊左下角的【+】,選擇所有的.h檔案。
配置需要暴漏的檔案的.h頭.png
第三步(方式二),修改項目配置
修改項目配置.png
第四步,修改匯出product配置
修改編譯配置.png
第五步,修改編譯指令集
設定Release為NO.png
模擬器:iPhone4s~5 : i386 iPhone5s~6plus : x86_64
真機:iPhone3gs~4s : armv7 iPhone5~5c : armv7s iPhone5s~6plus : arm64
如果第五步這裡,設定為YES,那麼編譯出來的.a靜態庫就只包含當前裝置的指令集。
舉個例子:如果我們選擇iPhone 5模擬器【Command+B】編譯,則編譯出來的.a靜態庫只能用iPhone4s~5模擬器跑程式,用iPhone5s~6plus,則會報找不到x86_64的libFMDB庫。
設定為NO,則會把所有指令集的都打包合并。
第六步,編譯(快速鍵【Command+B】
編譯時間,需要用模擬器和真機各編譯一次,這樣Products目錄下的libFMDB.a靜態庫才會變為黑色,右鍵show in Finder,可以進入Products目錄下。
編譯結果.png
為什麼需要用模擬器和真機各編譯一次呢?
可以看到Products目錄下有【Release-iphoneos】和【Release-iphonesimulator】兩個檔案件。前者裡面是真機使用的.a靜態庫,後者是模擬器使用的.a靜態庫。
注意:如果步驟四中,不將Build Configuration改為Release,則打包出來的靜態庫會存於【Debug-iphoneos】和【Debug-iphonesimulator】兩個檔案夾下。
我們一般都使用Release模式,因為程式最終發布之後是Release版的,所以靜態庫也是在Release模式下使用。
如果想要通用需要將模擬器使用的靜態庫與真機使用的靜態庫合并成一個靜態庫,可以使用終端命令來實現。命令格式:
lipo -create 第一個.a檔案的絕對路徑 第二個.a檔案的絕對路徑 -output 最終的.a檔案路徑。
本文中使用的命令如下:
lipo -create /Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-ctegiztcjikewoeprxxtmryzetfa/Build/
Products/Release-iphoneos/libFMDB.a
/Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-ctegiztcjikewoeprxxtmryzetfa/Build/
Products/Release-iphonesimulator/libFMDB.a
-output /Users/harvey/Desktop/libFMDB.a
補充:
經過多次實踐,第三步的操作省略,依然可以匯出可正常使用的包。
如果靜態庫中有category類,則在使用靜態庫的項目配置中【Other Linker Flags】需要添加參數【-ObjC]或者【-all_load】。
iOS-靜態庫,動態庫,framework淺析(二)