靜態庫.a文件和.framework文件


靜態庫.a文件和.framework文件

一、簡介

什么是庫:庫是程序代碼的集合,是共享程序代碼的一種方式。

根據源代碼公開情況,庫可以分為兩種:開源庫和閉源庫

開源庫

       公開源代碼,能看到具體實現。如:SDWebImage、AFNetworking

閉源庫

       不公開源代碼,是經過編譯后的二進制文件,看不到具體實現

       閉源庫主要分為:靜態庫和動態庫

二、靜態庫和動態庫

靜態庫和動態庫的存在形式

靜態庫:.a和.framework

動態庫:.dylib和.framework

靜態庫和動態庫在使用上的區別

       靜態庫:連接時,靜態庫會被完整的復制到可執行文件中,被多次使用就有多份冗余拷貝

             

       動態庫:連接時不復制,程序運行時有系統動態加載到內存,提供程序調用,系統只加載一次,多個程序共用,節省內存

             

注意:項目中使用了自制的動態庫,不能被上傳到AppStore

三、制作.a文件

1、選擇“Cocoa Touch Static Library”

 

2、輸入靜態庫名稱

 

3、添加庫需要包含的源代碼

 

 

4、選擇需要暴露出來的.h文件,.m文件會自動編譯到.a文件中

 

5、選擇真機設備,然后 Command+B 編譯,libMJRefresh.a文件從紅色變為黑色

選擇模擬器,依然 Command+B ,模擬器和真機環境下用的.a文件是分開的

 

6、右擊“Show In Finder”,查看制作好的.a文件

Debug-iphoneos文件夾里面的東西是用在真機上的

Debug-iphonesimulator文件夾里面的東西是用在模擬器上的

如果Scheme是Release模式,生成的文件夾就以Release開頭

7、合並.a文件

1)如果想讓一個.a文件能同時用在真機和模擬器上,需要進行合並。

在終端輸入指令:

lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a

ü  藍色部分是固定指令

ü  紅色、紫色是真機和模擬器.a文件的路徑

ü  綠色是所合成.a文件的路徑

2).a文件的體積(一般情況下)

真機用的.a > 模擬器用的.a

所合成.a == 真機用的.a + 模擬器用的.a

3)通過lipo –info libMJRefresh.a可以查看 .a 的類型(模擬器還是真機)

4)使用.a文件:

直接將.a、.h、資源文件拖拽到其他項目中即可

 

 

四、手工制作.framework文件

1、選擇“OS X”-“Framework & Library”-“Bundle”

 

2、輸入靜態庫名稱

 

3、修改配置

1)剛才是基於OS X創建的工程,所以得修改項目環境為iOS的

 

修改Linking

 

2)修改Packaging

 

 

3)修改Info.plist

 

4)注釋掉pch文件的內容

 

5)添加庫需要包含的源代碼

 

6)添加需要暴露出來的 .h 文件

 

 

7)添加需要暴露出來的 .h 文件,並且放到Public下面

 

4、生成.framework文件

跟 .a 是一樣的,分別選擇真機和模擬器,Command+B

真機和模擬器下的 .framework 也是分開使用的

生成的framework在Xcode的緩存文件夾中

/Users/用戶名/Library/Developer/Xcode/DerivedData/項目名/Products

5、合並.framework文件

可以在終端下使用lipo指令合並 .framework, 需要合並的是framework里面的某個文件

 

直接拖拽整個 .framework 到其他項目的Frameworks文件夾下

然后包含主頭文件:#import <MJRefresh/MJRefresh.h>

 

五、模板制作.framework

手工制作 .framework 過於復雜,借助開源模板進行制作會比較簡單

模板地址https://github.com/kstenerud/iOS-Universal-Framework

1、安裝模板

在終端下進入iOS-Universal-Framework/Fake Framework文件夾

執行指令./install.sh

安裝模板后,完全重啟Xcode

 

2、最后將 .framework 的結構調整一下即可

 

六、制作靜態庫的注意點

1、無論是.a靜態庫還是.framework靜態庫,最終需要的都是:

       二進制文件+.h+其他資源文件

2、.a和.framework的使用區別

       .a本身是一個二進制文件,需要配上.h和其他資源文件才能使用

       .framework本身已經包含了.h和其他資源文件,可以直接使用

3、圖片資源處理

如果靜態庫中用到了圖片資源,一般放到一個bundle文件中,bundle名字一般跟.a或者.framework名字一致

Bundle的創建:新建一個文件夾,擴展名改為.bundle即可,郵寄bundle文件,顯示包內容,就可以往包里放東西

 

4、多文件處理

如果靜態庫要暴露出來的.h文件比較多,可以考慮創建一個主頭文件(主頭文件一般和靜態庫同名)

在主頭文件中包含所有其他需要暴露出來的.h文件,在使用靜態庫的時候只需要:#import<主頭文件名>

5、.framework為什么既是靜態庫又是動態庫

系統的.framework是動態庫

我們自己創建的.framework是靜態庫

6、靜態庫中包含了Category

如果靜態庫中包含了Category,有時候在使用靜態庫的工程中會報“方法找不到”的錯誤(unrecognized selector sent to instance)

解決方案:在使用靜態庫的工程中配置Other Linker Flags為-ObjC

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM