原文 :http://blog.sina.com.cn/s/blog_7b9d64af0101jlym.html
在iOS的開發(fā)過程中浑厚,我們常常用到第三方的庫。尤其是QQ喷橙、百度地圖蛤吓、廣告等硼砰。
那么,如何制作自己的庫文件呢蜡娶?
如果混卵,將自己寫的功能類編譯成庫文件,分發(fā)給其他人來使用呢窖张?
靜態(tài)庫的優(yōu)點
編譯靜態(tài)庫的好處也還是有的幕随!
1.讓自己的源碼不被直接暴漏。
2.需要使用時宿接,僅僅拷貝相應(yīng)的.h文件和.a文件就好赘淮,不用在將源碼一一拷貝。方便睦霎。
3.顯得也比源碼拷貝高端拥知、大氣一些。
那么碎赢,廢話就不多說了低剔!準(zhǔn)備動工!
一肮塞、建立相應(yīng)的靜態(tài)庫項目
這樣襟齿,默認(rèn)獲得了項目同名的一組.h和.m文件。
熟悉吧枕赵,就在相應(yīng)的文件中猜欺,寫入功能函數(shù)!在本例子中拷窜,簡單的直接寫入相應(yīng)的2個方法开皿。
MyStaticLibraryDemo.h
文件
#import
@interfaceMyStaticLibraryDemo:NSObject
///加法
-(int)addMethodByFirst:(int)theFirst andSecond:(int)theSecond;
///減法
-(int)SubMethodByFirst:(int)theFirst andSecond:(int)theSecond;
@end
MyStaticLibraryDemo.m
文件
#import"MyStaticLibraryDemo.h"
@implementationMyStaticLibraryDemo
///加法
-(int)addMethodByFirst:(int)theFirst andSecond:(int)theSecond{
return(theFirst+theSecond);
}
///減法
-(int)SubMethodByFirst:(int)theFirst andSecond:(int)theSecond{
return(theFirst-theSecond);
}
@end
要做的涧黄,就這么簡單,然后赋荆,調(diào)試代碼無誤后笋妥,就可以進(jìn)行編譯了!
二窄潭、編譯靜態(tài)庫文件:XXXX.a
方法一春宣,直接編譯(command+B)。
這時嫉你,會發(fā)現(xiàn)月帝,libMyStaticLibraryDemo.a生成了!進(jìn)入相應(yīng)的編譯目錄幽污,會看到:
ok嚷辅,有兩個目錄下的文件是我們需要的。
Release-iphoneos:應(yīng)用于真機的靜態(tài)庫文件距误。
Release-iphonesimulator:應(yīng)用于模擬器調(diào)試的靜態(tài)庫文件潦蝇。
我們需要使用終端命令來看一下生成的相應(yīng)的.a文件的屬性(測試環(huán)境為作者本機環(huán)境):
1.Release-iphoneos版本
bogon:~ zhangzhen$cd/Users/zhangzhen/Library/Developer/Xcode/DerivedData/MyStaticLibraryDemo-ciwnhcsbqgclkododazbmbmtdlfp/Build/Products/Release-iphoneos
bogon:Release-iphoneos zhangzhen$lipo
-infolibMyStaticLibraryDemo.a
Architectures in the fat file:libMyStaticLibraryDemo.a are: armv7 armv7sarm64
可見,編譯的可執(zhí)行的CPU環(huán)境為arm7深寥、armv7s攘乒、arm64。
2.Release-iphonesimulator版本
bogon:~ zhangzhen$cd/Users/zhangzhen/Library/Developer/Xcode/DerivedData/MyStaticLibraryDemo-ciwnhcsbqgclkododazbmbmtdlfp/Build/Products/Release-iphonesimulator
bogon:Release-iphonesimulator zhangzhen$lipo -infolibMyStaticLibraryDemo.a
Architectures in the fat file:libMyStaticLibraryDemo.a are: i386x86_64
可見惋鹅,編譯的可執(zhí)行版本為i386 x86_64
三则酝、使用靜態(tài)庫
在你的要使用太靜態(tài)庫的項目中導(dǎo)入libMyStaticLibraryDemo.a文件和include文件夾中的相應(yīng)的所有.h頭文件。
例如闰集,我要在MyLibraryTest項目中沽讹,使用我上述編譯好的靜態(tài)庫文件。
導(dǎo)入完成后武鲁,項目如下:
注意:你在真機調(diào)試和模擬器調(diào)試的時候爽雄,要替換相應(yīng)的.a文件版本。
在需要使用該靜態(tài)庫的地方沐鼠,導(dǎo)入相應(yīng)的.h文件挚瘟。你就可以使用了!
MyStaticLibraryDemo*myLibrary=[[MyStaticLibraryDemoalloc]init];
intresult= [myLibraryaddMethodByFirst:5andSecond:5];
NSLog(@"Result:%d",result);
result=[myLibrarySubMethodByFirst:10andSecond:5];
NSLog(@"Result:%d",result);
當(dāng)然饲梭,你也可以乘盖,針對相應(yīng)的用途來編譯相應(yīng)的.a靜態(tài)庫。
1.選擇Edit
Scheme項:
2.使用Build
Configuration 來編譯相應(yīng)的用途版本:
這樣憔涉,你就可以得到相應(yīng)用途的靜態(tài)庫編譯版本订框。
如果,你在使用中兜叨,很不幸的遇到了以下問題:
ld: warning: ignoring file/Users/XXXX/Documents/MyLibraryTest/MyLibraryTest/MyLibrary/libMyStaticLibraryDemo.a,missing required architecture i386 in
file/Users/XXXX/Documents/MyLibraryTest/MyLibraryTest/MyLibrary/libMyStaticLibraryDemo.a(3 slices)
Undefined symbols for architecture
i386:
"_OBJC_CLASS_$_MyStaticLibraryDemo", referencedfrom:
objc-class-ref in AppDelegate.o
ld: symbol(s) not found for architecture
i386
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
如圖:
那么穿扳,我也很不幸的告訴你衩侥,你導(dǎo)入錯誤的編譯版本。
以上錯誤矛物,是你的庫文件(.a)為真機版本茫死,你卻用模擬器來調(diào)試程序。將調(diào)試目標(biāo)換成真機泽谨,即可璧榄!
四特漩、合并靜態(tài)庫(真機+模擬器)
如果吧雹,你的調(diào)試需要不斷在真機和模擬器之間切換。那么涂身,制作一個通用的靜態(tài)庫.a文件是一個好想法雄卷。
這樣,使用該靜態(tài)庫文件就可以在真機和模擬器上調(diào)試蛤售。
制作過程也是非常簡單丁鹉。動手吧:
1.使用終端合并2個版本。
bogon:~ zhangzhen$lipo -create/所在路徑/Release-iphoneos/libMyStaticLibraryDemo.a/所在路徑/Release-iphonesimulator/libMyStaticLibraryDemo.a-output/Users/zhangzhen/Desktop/libUniversal.a
bogon:~ zhangzhen$
這樣悴能,就可以合并一個通用版本的靜態(tài)庫揣钦。唯一不爽的,就是體積要大一些漠酿。
通用版本大小>=模擬器版本大小+真機版本大小冯凹。
2.集成通用靜態(tài)庫
我想,不用我介紹太多了炒嘲,將以上合并的通用版本的靜態(tài)庫文件(libUniversal.a)拖入項目中宇姚。即可。這時候夫凸,你的靜態(tài)庫浑劳,可以使用真機+模擬器。