iOS開發之靜態庫.a 以及合並


靜態庫和動態庫

靜態庫和動態庫的存在形式
靜態庫: .a 和 .framework

動態庫: .dylib 和 .framework

靜態庫和動態庫在使用上的區別
靜態庫:鏈接時,靜態庫會被完整地復制到可執行文件中, 被多次使用就有多份冗余拷貝

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

 

制作 .a

新建項目-> 選擇 “Cocoa Touch Static Library”

就在.h文件中,寫入功能函數!簡單的直接寫入1個方法,並實現方法,例子是把輸入的字符串打印兩邊

#import <Foundation/Foundation.h>

@interface MyStaticLibraryDM : NSObject

//將輸入的字符串打印兩邊
-(void)printMyInput:(NSString*)inputString;

@end
#import "MyStaticLibraryDM.h"

@implementation MyStaticLibraryDM

-(void)printMyInput:(NSString*)inputString{

    NSLog(@"inputString === %@ twice is ==== %@",inputString,inputString);
}

@end

然后,調試代碼無誤后,就可以進行編譯了

 

編譯靜態庫

注意:需要修改Build Settings中的 Build Active Architecture Only 以滿足運行不同CPU環境的模擬器。 將此設置為NO。

在不同編譯環境下編譯會生成四種靜態庫,debug模擬器,debug真機,release模擬器,release真機,我們需要將運行環境調至不同的狀態並生成如上四種形式的靜態庫。這里只以一種情況為例:
設置是Debug還是release
選擇Edit Scheme--> Buid Configuration設置為release
設置模擬器還是真機
就是設置模擬器還是真機,因為之前我們將只編譯當前環境設置為NO,所以編譯出來的靜態庫會支持各種CPU環境。

最后按住 command+b 編譯!

你會發現你的靜態庫文件從紅色變成了黑色,這就是編譯完成了啊。可以 show in finder 查看文件所在位置。

上面是我在不同環境運行之后的結果

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

其他是在Release模式環境生成的 

 

如果想讓一個 .a 文件能同時用在真機和模擬器上,需要進行合並
在終端輸入指令

lipo -create 靜態庫1 靜態庫2 -output 新靜態庫名稱.a
localhost:~ micaimanong$ cd /Users/micaimanong/Library/Developer/Xcode/DerivedData/MyStaticLibraryDM-fczwjaefnkvdmjelggxccgpicgwy/Build/Products 
localhost:Products micaimanong$ lipo
-create Debug-iphoneos/libMyStaticLibraryDM.a Debug-iphonesimulator/libMyStaticLibraryDM.a -output libMyStaticLibraryDM.a

先進入products 在將其中的兩個合並 合並之后生成一個新的.a文件 

 

如下圖所示 libMyStaticLibraryDM.a 支持模擬器和真機

 

 

最后就是引用了

在你的要使用太靜態庫的項目中導入libMyStaticLibraryDM.a文件和include文件夾中的相應的所有.h頭文件。
 
例如,我要在MyLibraryTest項目中,使用我上述編譯好的靜態庫文件。
 
導入完成后,項目如下:
 

之后引用文件並實現方法

打印如下 將輸入的字符串打印了兩邊

 

如果遇到下面的問題

原因是你導入錯誤的編譯版本。
以上錯誤,是你的庫文件(.a)為真機版本,你卻用模擬器來調試程序。將調試目標換成真機,或者使用合並之后的(.a)文件也可以解決。

操作時會遇到很多問題,具體問題具體對待。


免責聲明!

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



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