iOS 中 .a 和 .framework 靜態庫的建立與 .bundle 資源包的使用


iOS 中 .a 和 .framework 靜態庫的建立與 .bundle 資源包的使用

前言

開發中常常使用三方庫去實現某特定功能,而這些三方庫一般又分爲開源庫和閉源庫。開源庫能夠直接拿到源碼,和本身寫的沒有什麼區別,咱們能夠最大程度的修改源碼來適應本身功能。閉源庫就是被髮布者提早打包好的靜態庫或 Bundle 包,對此咱們沒法看到內部實現,對於其封裝好的特定功能,咱們也只須要調用其開放的API便可。css

本文就來說解一下 .a 和 .framework 靜態庫的建立與 .bundle 資源包的使用。html

庫分靜態庫和動態庫兩種。從本質上來講是一種可執行代碼的二進制格式,能夠被載入內存中執行。nginx

靜態庫和動態庫是相對編譯期和運行期的:靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將再也不須要改靜態庫;而動態庫在程序編譯時並不會被連接到目標代碼中,只是在程序運行時才被載入,由於在程序運行期間還須要動態庫的存在。web

靜態庫的形式

形式爲 :.a 和 .framework 兩種

其中 .framework 類型的庫若是是系統內部的是動態庫,咱們本身建立的是靜態庫

.a 和 .framework 的區別

.a是一個純二進制文件,.framework中除了有二進制文件以外還有資源文件。
.a文件不能直接使用,至少要有.h文件配合,.framework文件能夠直接使用。
.a + .h + sourceFile = .framework。
建議用.framework。

靜態庫的優點

  1. 方便共享代碼,便於合理使用。
  2. 實現iOS程序的模塊化。能夠把固定的業務模塊化成靜態庫。
  3. 和別人分享你的代碼庫,但不想讓別人看到你代碼的實現。
  4. 開發第三方sdk的須要。

建立和打包 .a 靜態庫

  1. 建立靜態庫項目
    iOS --> Framework & Library --> Cocoa Touch Static Library
  2. 把須要編譯成靜態庫的代碼拖進項目
  3. 設置可見的.h文件。
    Build Phases --> Copy Files 添加.h文件便可。

15121192841839.jpg

15121206665244.png

15121206796855.png

15121206850570.png

  1. 修改支持的架構
    4.1 設置支持全部模擬器架構 Build Settings --> Build Active Architecture Only --> Debug 改成 NO
    4.2設置支持全部手機架構 canvas

  2. 編譯
    編譯一次模擬器,編譯一次手機。
    會生成.a文件 和 可見的頭文件。
    使用命令行,合併剛剛生成的的兩個路徑,到另外一個路徑,例如:
    lipo -create 模擬器lib路徑 真機lib路徑 -output /Users/username/Desktop/libPSSTest.aruby

  3. 使用靜態庫
    注意:若是這個靜態庫須要依賴庫,也是須要引入依賴庫。markdown

建立和打包 .framework 靜態庫

  1. 建立Framework項目
    iOS --> Framework & Library --> Cocoa Touch Framework架構

  2. 修改打包的framework是動態庫仍是靜態庫
    framework項目默認是動態庫。
    靜態庫配置:Build Settings --> Mach-O Type --> 改成 Static Libraryapp

  3. 把須要編譯成靜態庫的代碼拖進項目
    設置可見頭文件
    項目建立後,項目中只有一個主頭文件。
    Build Phases --> Headers --> public 添加頭文件yii

  4. 編譯
    編譯一次模擬器,編譯一次手機

  5. 使用
    把framework引入項目。
    若是是動態庫須要在 General --> Embedded Binaries 中引入配置。
    若是是靜態庫就不須要配置了。

靜態庫問題

  1. 靜態庫位置 Debug運行真機編譯會把靜態庫生成到 Debug-iphoneos目錄下
    Debug運行模擬器編譯會把靜態庫生成到 Debug-iphonesimulator目錄下
    Release運行真機編譯會把靜態庫生成到 Release-iphoneos目錄下
    Release運行模擬器編譯會把靜態庫生成到 Release-iphonesimulator目錄下
  2. Debug版本 VS Release版本
    • 調試版
      調試版本會包含完整的符號信息,以方便調試
      調試版本不會對代碼進行優化
    • 發佈版
      發佈版本不會包含完整的符號信息 發佈版本的執行代碼是進行過優化的
      發佈版本的大小會比調試版本的略小
      在執行速度方面,調試版本會更快些,但不意味着會有顯著的提高
  3. Undefind symbols for architecture arm64(i386)
    緣由:是靜態庫不支持cpu arm64(i386)架構
  4. iPhone手機的cpu架構

    • 模擬器
      iPhone4s,5 是 i386架構
      iPhone5s之後 是x86_64架構
    • 發佈版
      iphone1代,3G,3GS 是 armv6架構
      iPhone4,4s 是 armv7架構
      iphone5,5s,5c 是 armv7s架構
      iPhone6,6s,6plus,6splus 是 arm64架構
  5. 查看.a庫所支持的架構類型
    lipo -info xxx.a

  6. .a靜態庫合併
    lipo -create 真機靜態庫.a 模擬器靜態庫.a -output 新文件.a
    (最好指定一個目錄,不然會默認當前目錄)
    只合並Debug版本 或者 只合並Release版本便可。

  7. 查看.framework庫所支持的架構類型
    7.1 進入到framework文件夾中
    7.2 lipo -info Framework 便可

靜態庫編譯錯誤

  1. MRC 錯誤:會提示好多的autorelease,release,retain等錯誤
    解決方案:給這個文件MRC編譯 或者項目改爲MRC環境
  2. 找不到 <libxml/HTMLparser.h>頭文件 編譯缺乏系統庫,配置:Build Settings --> 搜索Header Search Paths --> 配置 $(SDK_DIR)/usr/include/libxml2
  3. framework項目,名字中不能帶特殊字符 會報 test-framework is not a valid PROJECT_NAME

依賴庫錯誤

1._SCNetWork開頭
導入SystemConfiguration.framework
2._UITypeCopy開頭 + _kUITag開頭
  導入MobileCoreServices.framework
3._defalate開頭 + _inflate開頭
  導入 libz.tbd
4._xml開頭
  導入libxml2.tbd

引入靜態庫運行錯誤

1.運行崩潰
假設不是靜態庫內部錯誤,那麼就設置項目的Build Settings --> Other Linker Flags --> 爲 -ObjC

資源靜態庫.bundle

1.建立一個文件夾
2.把資源(圖片,plist...)放到文件夾中
3.把文件夾後綴改成bundle就能夠了
4.資源庫的使用
在靜態庫中,咱們得到資源的方式改成從這個bundle資源包中得到就能夠了。
例如:[UIImage imageNamed:@"xxx.bundle/xxx"];

建立一個可測試的靜態庫

1.建立一個項目 2.給項目添加一個靜態庫Target 3.編譯靜態庫 4.配置引用靜態庫 General --> Linked Frameworks and Libraries --> 添加靜態庫.a 5.運行項目 -- 這樣就能夠調試了.

相關文章
相關標籤/搜索