xcode編譯生成.framework、.a靜態庫

一、概念解析

靜態庫:

被完整的拷貝到可執行文件中,被多次使用就有多份拷貝,有a 和 .framework兩種形式;

動態庫:

程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存,有dylib 和 .framework 兩種形式

系統的.framework是動態庫,自己可編譯的.framework靜態庫和動態庫(據說用動態庫app審覈會通不過,沒有驗證,咱也不知道是真是假)

.a與.framework的區別

.a是一個純二進制文件,.framework中除了有二進制文件之外還有資源文件和.h文件。.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。

兩者關係:
.a + .h + sourceFile = .framework。

二、靜態庫生成步驟

生成.a

1.打開xcode新建一個project,選擇.a類型,然後next新建一個項目。

2.新建或拖入已有的源碼文件(可以是OC 、C、 C++的源碼文件)

3.更改配置
(1)首先是Dead Code Stripping設置爲NO,網上對此項的解釋如下,大致意思是如果開啓此項就會對代碼中的”dead”、”unreachable”的代碼過濾,不過這個開關是否關閉,似乎沒有多大影響,不過爲了完整還原framework中的代碼,將此項關閉也未曾不可。

(2)然後將Link With Standard Libraries關閉,可能是爲了避免重複鏈接。
(3)最後將Mach-O Type設爲Static Library。



4.打包
打包分爲模擬器版本和真機版本,選擇generic iOS Device打包爲真機版本,選擇任意一個模擬器打包則爲模擬器版本。點擊build按鈕打包。

5.查看靜態庫支持的 編譯系統
許多第三方提供的.a文件(一般是那些SDK),嵌入到我們的xcode項目後,生成不會報錯。

 一部分粗心的SDK提供方,或者我們自己做的.a文件,就會有報錯,常見的就是不是armv7結構,或者不是armv7s結構,如果在模擬器中運行,會報不是i386結構。 原因是:armv7是支持比iphone5舊的那些設備,armv7s是iphone5或ipad4或者以後的新設備,i386是mac的。 這些名字指的是處理器所用的指令集。 

因此常常發生的是.a文件要麼模擬器可以Build成功,但真機不能Build成功。要麼就相反,讓人抓狂。

這個時我們可以通過以下方式來查看靜態庫支持的編譯環境即可以運行在哪些設備上

lipo -info XXXX.a 

這個時我們得到一個支持模擬器的靜態庫,爲了方便使用我們將支持模擬器 和真機的靜態庫 合併,這樣就不用操心這個庫是什麼庫了。

6.合併
打開終端,輸入lipo -create 模擬器.a的二進制文件地址 真機.a二進制文件地址 -output 新文件地址 然後回車,將新二進制文件替換任意一個.a裏的二進制文件,即可得到合併後的framework。
終端命令:

 lipo -create /Users/xxx/Desktop/1\ 2019-05-18\ 18-28-33/2/lib_json.a /Users/xxx/Desktop/1\ 2019-05-18\ 18-28-33/3/lib_json.a  -output /Users/xxx/Desktop/1\ 2019-05-18\ 18-28-33/1/lib_json.a 


生成.framework

創建工程時,選擇Cocoa Touch Framework,其餘步驟與創建.a類似,不再詳細講述。
注意事項:1、framework 在某些情況下出現error,此時需要在該工程中 other linker flags添加兩個參數 -ObjC -all_load。(



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章