iOS 靜態庫製作及使用問題
靜態庫使用目標:(.a )
> 自己製作一個靜態庫(可以使用)(前三步)
> 製作模擬器版本和真機版本 (第四步)
> 合并兩個版本 (第六步)
建立靜態庫步驟:
1. 選擇要建立的檔案類型:Cocoa Touch Static Library (.a檔案)
2.將需要封裝的檔案匯入其中
選擇工程找到target(靜態庫) -> Build Phases -> Compile Sources中添加需要封裝的類
3. 設定編譯配置
編譯EditSchem->選擇Run,選擇info,設定其Build Configuration :release/debug
選擇工程:Project->Build Setting -> Code Signing -> Code Signing Identity 選擇其與上面相對應的,release或是debug,設定其為iOS Developer 【注意開始選的是Project不是Targets】
4. 選擇project->iOS Device,點擊運行後會產生arm6,arm7靜態庫,【註:此時產生的靜態庫是適用於真機上的,並不適合用在模擬器】如果需要產生i386的靜態庫【模擬器用】可以通過選擇模擬器再運行一次,【不能用showInFinder開啟,不然只是針對真機的】即可在相應DerivedData中相應工程的Build -> Products Debug-iphonesimulator中找到相應的靜態庫檔案。
小技巧:可通過命令 lipo -inof 路徑/檔案名稱.a 查看檔案是否具備arm 或是 i386的條件
5. 編譯成功後便可使用
註:Debug版本與release版本區別在於調試版本與發布版本,深度區別在於其動態庫的使用。其都是有相應的模擬器與真機模式的靜態庫檔案。
可能出現的問題:undefine symbols for architecture i386
問題解析: 用錯了編譯出來的.a lib,在模擬器裡面,我們需要的是基於i386架構編譯的static lib,但是這個a檔案,編譯出來其實是arm6 arm7架構的。因為我們使用show in finder指向的是一個ios device的庫,並不是i386模擬器下的庫,如果想要編譯i386的庫,就需要注意第4點操作,然後去DerivedData中找到iphonessimulator中的static lib
其實我們開啟到Products Debug檔案就可以看到裡面有兩個檔案夾:
Release-iphoneos 或Debug-iphoneos :裡面的是基於arm6 arm7編譯出來的庫檔案。
Release-iphonesimulator:裡面是基於i386編譯出來的檔案。
6. 將模擬器支援的版本和真機支援的版本合并到一起
lipo -create 路徑/模擬器版本.a 路徑/真機版本.a -output 想放的路徑/靜態庫名稱.a
打包後可查看其支援哪個版本:
lipo -info 路徑/合并後的靜態庫名稱.a
結果展示:
li****:Desktop mac$ lipo -info libdemo.a
Architectures in the fat file: libdemo.a are: armv7 i386 arm64