標籤:style blog http io os 使用 ar 檔案 2014
前面已經介紹了iOS中靜態庫的基本概念和特點,這裡就不再多廢話,直接上代碼
編譯環境Xcode5.1 + Mac OS X 10.9.3
建立靜態庫項目
Xcode中建立靜態庫的模板有兩個,一個是建立iOS靜態庫,另一個是建立Mac OS X靜態庫,我們選擇前者
點擊右下角Next按鈕進入下一步
給工程起個名字MyToolsA,其餘的按預設值
點擊Next下一步
我們所關心的就只有MyToolsA.h和MyToolsAm檔案,其他的暫且不管
// MyToolsA.h// MyToolsA//// Created by LZH on 14-8-14.// Copyright (c) 2014年 LZH. All rights reserved.//#import <Foundation/Foundation.h>@interface MyToolsA : NSObject- (int)add: (int)x Second: (int)y; //對象方法+ (int)sub: (int)x Second: (int)y; //類方法@end
// MyToolsA.m// MyToolsA//// Created by LZH on 14-8-14.// Copyright (c) 2014年 LZH. All rights reserved.//#import "MyToolsA.h"@implementation MyToolsA- (int)add: (int)x Second: (int)y{ return x + y;}+ (int)sub: (int)x Second: (int)y{ return x - y;}@end
程式碼完成後開始編譯
編譯之前需要先配置工程,因為預設情況是產生Debug版本,如果需要產生Release版本就需要重新設定
Xcode->Product->Scheme->Edit Scheme... 或者直接按快速鍵"Shift + Command + 逗號"彈出配置面板
將Debug選項改為Release選項
將編譯目標改為iOS Device ,表示編譯產生的是真機版本的靜態庫
點擊左上方紅框內的三角按鈕或者快速鍵"Command + b"進行編譯,當看到“Build Succeeded”表明編譯成功
然後便可以看到Products目錄下的libMyToolsA.a由紅色變成了黑色,說明我們已經成功產生了靜態庫檔案
右鍵點擊libMyToolsA.a選擇"Show in Finder"
找到libMyToolsA.a所在檔案夾
切換編譯目標,將iOS Device 改為 iPhone Retina (3.5-inch),編譯產生適用於模擬器的靜態庫
OK,現在真機版本的靜態庫和模擬器版本的靜態庫都已經產生,下面的工作是要將二者合并,產生一個既適用於真機又適用於模擬器的靜態庫
需要使用下面的命令
lipo -create 1.a 2.a -output 12.a
開啟終端,為了方便期間,直接切換到超級使用者
找到靜態庫所在目錄
彈出屬性菜單,在“位置”屬性中記錄的便是該目錄所在的絕對路徑,複製粘貼到終端視窗,即可進入指定檔案夾
然後使用lipo命令合成靜態庫
我們來驗證一下產生的庫是否支援我們想要的平台
可以看出,我們最終產生的庫libMyToolsA.a同時支援32位模擬器架構i386、64位模擬器架構x86_64、32位真機架構armv7/armv7s及64位真機架構arm64
跟我們的預期相吻合。
下面便是測試工程
此處選擇iOS工程的單視圖模板
右鍵點擊"New Group"新群組"MyTools",將剛剛產生的庫檔案libMyToolsA.a和標頭檔MyToolsA.h拖動至MyTools下
注意:
拖動時同時按住Alt鍵,這樣就是複製而不是移動,原來的檔案都還在,否則就會把原位置的檔案刪除了
由於.a靜態庫的使用必須由標頭檔配合,所以也要把.h檔案拷貝過來
必須勾選上Add to targets 下的StaticLibATest目標,否則即使把檔案放進來編譯目標時也無法使用
要使用剛剛匯入的靜態庫,只需要加入其標頭檔即可
修改ViewController.m檔案
// ViewController.m// MyToolsATest//// Created by LZH on 14-8-15.// Copyright (c) 2014年 LZH. All rights reserved.//#import "ViewController.h"#import "MyToolsA.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad{ [super viewDidLoad];// Do any additional setup after loading the view, typically from a nib. int x = 10, y = 7; //使用類方法 NSLog(@"%d - %d = %d", x, y, [MyToolsA sub: x Second: y]); //使用對象方法 MyToolsA *myToolsA = [[MyToolsA alloc] init]; NSLog(@"%d + %d = %d", x, y, [myToolsA add: x Second: y]); }- (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}@end
運行結果:
模擬器
真機
OK,大功告成,輸出結果跟我們預期的完全一樣。
iOS開發之靜態庫(二)—— .a