iOS靜態庫(配置版)

2021-08-05 23:37:39 字數 2844 閱讀 5760

隨筆 - 121  

文章 - 0  

objc上的庫一般分為兩類

靜態庫: .a 和 .framework

.a檔案:純二進位制檔案,需要配合.h檔案一起使用,通過.h檔案引用庫裡面的內容

.framework檔案:包含二進位制檔案

鏈結時,靜態庫會被完整地複製到可執行檔案中,例如ios程式打包的時候會包含所有引用的靜態庫

動態庫: .dylib 和 .framework

這裡只討論靜態鏈結庫,這裡只討論.a檔案的生成,.framework檔案先不討論

1、下面我們建立乙個自己的靜態庫(cocoa touch static library)

2、新增自己的類和category

編譯的時候需要將 標頭檔案拷貝到生成的庫路徑下,這裡的標頭檔案是用於給外部使用的,一般是把庫裡面的檔案放在乙個標頭檔案中引用,這樣外部在使用的時候直接引用該標頭檔案即可

3、設定支援的最低版本和最高版本

base sdk:是當前類庫是基於哪個版本的sdk開發的,也就是最高支援的sdk

deployment target:類庫支援的最低版本

4、配置編譯選項

由於我們編譯的是類庫,在使用的時候需要支援debug和release兩種模式下,需要編譯所有的architecture版本

4、編譯(cmd + b)

我們分別切換到模擬器和真機模式進行編譯,在真機模式下編譯完成後,products中的檔案會變正常(原來為紅色)   

注意,需要設定build release 版本

5、編譯完成

編譯完成後我們得到很多個.a檔案,每個目錄下都對應乙個.a檔案,從libcalculator.a進入finder檢視

iphoneos是真機用的

iphonesimulator是給模擬器用的

6、使用

我們建立乙個ios專案,吧相關的.a檔案和.h檔案拖到我們的專案中,拖入後,xcode會自動把靜態庫新增到工程

這裡需要注意的是

1、標頭檔案也要引入到工程裡面(不然你怎麼用)

2、模擬器和真機對應的.a檔案不一樣,根據需要引用.a檔案

2、如果靜態庫內有category分類,那麼需要在新增-objc 編譯標識,否則可能會報:unrecognized selector sent to instance 

3、其他編譯引數

-objc:加了這個引數後,鏈結器就會把靜態庫中所有的objective-c類和分類都載入到最後的可執行檔案中

-all_load:會讓鏈結器把所有找到的目標檔案都載入到可執行檔案中,但是千萬不要隨便使用這個引數!假如你使用了不止乙個靜態庫檔案,然後又使用了這個引數,那麼你很有可能會遇到ld: duplicate symbol錯誤,因為不同的庫檔案裡面可能會有相同的目標檔案,所以建議在遇到-objc失效的情況下使用-force_load引數。

-force_load:所做的事情跟-all_load其實是一樣的,但是-force_load需要指定要進行全部載入的庫檔案的路徑,這樣的話,你就只是完全載入了乙個庫檔案,不影響其餘庫檔案的按需載入

引用自:

4、如果靜態庫中採用objectc++實現,或者靜態庫使用c/c++寫的,在呼叫的時候可能出錯,因此需要您保證您工程中至少有乙個.mm字尾的原始檔(您可以將任意乙個.m字尾的檔案改名為.mm)

或者在工程屬性中指定編譯方式,即將xcode的project -> edit active target -> build -> gcc4.2 - language -> compile sources as設定為"objective-c++"

引用自:

7、合併.a檔案

上面看到,編譯後的用於模擬器的靜態庫和用於真機的靜態庫不一樣,每次切換的適合都得重新引用.a檔案,這樣顯得特別麻煩,蘋果提供了乙個合併多個.a檔案的方法,合併後的.a檔案真機和模擬器都支援(合併後大小為原來兩個檔案大小之和)

在終端通過命令合併

lipo –create release-iphoneos/libsqlcipher.a release-iphonesimulator/libsqlcipher.a –output libsqlcipher.a
還有一種方法可以動態的引用靜態庫,就是通過配置工程的庫引用路徑和編譯標示,編譯的適合xcode會根據當前的環境自動找到相關的.a庫,參見:

8、demo  

iOS 靜態庫 在iOS中建立靜態庫

學習了creating a static library in ios tutorial 本想做一下翻譯的工作,但是在網上已經有人翻譯過了,因此不添足。譯文請見 在ios中建立靜態庫 在實踐中,發現了一些奇怪的錯誤。根據文章編寫了程式,imagefilters,寫了指令碼生成通用靜態庫,在corei...

iOS合併靜態庫

對ios專案來說,靜態庫對於裝置 device 和模擬器 simulator 的編譯是不一樣的。需要鏈結靜態庫的工程在編譯device和simulator的時候需要區別對待。需要鏈結到不同的靜態庫。這就很麻煩。解決方法是使用lipo指令,將device靜態庫和simulator靜態庫合併為乙個靜態庫...

iOS靜態庫管理

解決一下幾個問題 1.生成device和simulator通用的.a檔案 2.debug版應用程式呼叫debug版.a,release版應用程式呼叫release版.a 由於ios生成的庫的屬性比較多,因此開發人員需要對靜態庫進行必要的管理。我只是提供了一種我認為比較不錯的辦法,可以相對提高一些效率...