iOS 靜態(tài)庫(一)

常見庫文件格式

  • .a:靜態(tài)庫
  • .dylib:動態(tài)庫
  • .framework:動肴熏、靜態(tài)庫
  • .xcframework:針對不同架構(gòu)的動赂蠢、靜態(tài)庫

靜態(tài)庫

靜態(tài)庫是.o文件的合集
我們可以通過ar -t命令來驗證

image.png

  • 新建一個test.m文件腾供,并在同級目錄下放入AFNetworking靜態(tài)庫
#import <Foundation/Foundation.h>
#import <AFNetworking.h>

int main(){
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    NSLog(@"testApp----%@", manager);
    return 0;
}
image.png

.m文件編譯成.o文件

我們通過clang命令來完成編譯

  • 我們在生成目標文件的時候只需要頭文件的路徑,因為鏈接器會根據(jù)重定位符號去查找對應的符號
clang -x objective-c \    //指定oc語言
-target x86_64-apple-macos11.1 \     //指定生成的是X86_64_macOS架構(gòu)的代碼
-fobjc-arc \    //使用ARC
-isysroot     /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk \    //指定SDK的路徑
-I./AFNetworking \    //在指定目錄尋找頭文件 header search path
-c test.m -o test.o      //輸出目標文件.o

.o文件鏈接靜態(tài)庫 生成可以執(zhí)行文件

clang -target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk \
-L./AFNetworking \  //指定庫文件路徑(.a\.dylib庫文件) library search path
-lAFNetworking \  //指定鏈接的庫文件名稱(.a\.dylib庫文件)other link flags -lAFNetworking
test.o -o test
  • 生成的可執(zhí)行文件,我們在終端通過lldb來執(zhí)行
//1恋追、
lldb
//2、
file test
//3颅崩、
run

.o文件轉(zhuǎn)換成靜態(tài)庫

ar壓縮目標文件几于,并對其進行編號和索引,形成靜態(tài)庫沿后。同時也可以解壓縮靜態(tài)庫沿彭,查看有哪些目標文件:

 ar -rc  bbb.a bbb.o   -- 將bbb.o轉(zhuǎn)換成靜態(tài)庫bbb.a
     -r:                         -- 將bbb.a添加或者替換文件
     -c:                         -- 不輸出任何信息
     -t:                         -- 列出包含的目標文件

靜態(tài)庫合并

libtool -static -o <輸出的靜態(tài)庫名字> <需要合并的靜態(tài)庫> <需要合并的靜態(tài)庫>

Framework

Framework是一種打包方式,將庫的二進制尖滚、頭文件和資源文件打包到一起喉刘,方便管理和分發(fā)
Framework和系統(tǒng)的Framework有很大區(qū)別,系統(tǒng)的Framework不需要拷貝到目標程序漆弄,自己做的Framework最終都是要拷貝到App中(App和Extension的Bundle是共享的)睦裳,因此又稱為Extension Framework

Framework

手動創(chuàng)建一個Framework

  • 新建TestExample.hTestExample.m

    image.png

  • 通過下面命令將TestExample.m編譯成TestExample.o

clang -x objective-c \
-target x86_64-apple-macos11.3 \
-fobjc-arc \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk \
-c TestExample.m -o TestExample.o
image.png
  • 通過ar命令將TestExample.o轉(zhuǎn)換成 靜態(tài)庫TestExample.a
ar -rc TestExample.a TestExample.o
image.png
  • 按照圖中目錄結(jié)構(gòu)將文件添加進去


    image.png

下面我們通過鏈接Framework來測試是否成功

  • 新建test.m
#import <Foundation/Foundation.h>
#import "TestExample.h"

int main(){
    NSLog(@"testApp----");
//    TestExample *manager = [TestExample new];
//    [manager lg_test: nil];
    return 0;
}
image.png
  • 通過下面命令將test.m鏈接成test.o
clang -x objective-c \
-target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk \
-I./Framework/TestExample.framework/Headers \
-c test.m -o test.o
  • test.o鏈接TestExample.framework生成可以執(zhí)行文件
clang -target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk \
-F./Framework \
-framework TestExample \
test.o -o test
image.png
  • 進入lldb環(huán)境,運行可執(zhí)行文件
    image.png

總結(jié)

clang命令參數(shù):
     -x: 指定編譯文件語言類型
     -g: 生成調(diào)試信息
     -c: 生成目標文件撼唾,只運行preprocess廉邑,compile,assemble倒谷,不鏈接
     -o: 輸出文件
     -isysroot: 使用的SDK路徑
     1. -I<directory> 在指定目錄尋找頭文件 header search path
     2. -L<dir> 指定庫文件路徑(.a\.dylib庫文件) library search path
     3. -l<library_name> 指定鏈接的庫文件名稱(.a\.dylib庫文件)other link flags -lAFNetworking
     -F<directory> 在指定目錄尋找framework framework search path
     -framework <framework_name> 指定鏈接的framework名稱 other link flags -framework AFNetworking

//靜態(tài)庫合并
 libtool -static -o <OUTPUT NAME> <LIBRARY_1> <LIBRARY_2>

//.o文件生成靜態(tài)庫
//`ar`壓縮目標文件蛛蒙,并對其進行編號和索引,形成靜態(tài)庫渤愁。同時也可以解壓縮靜態(tài)庫牵祟,查看有哪些目標文件:

 ar -rc a.a a.o
    -r: 像a.a添加or替換文件
    -c: 不輸出任何信息
    -t: 列出包含的目標文件

shell腳本

SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.3.sdk
FILE_NAME=test
HEADER_SEARCH_PATH=./StaticLibrary

echo "-----開始編譯test.m"
clang -x objective-c \
-target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot $SYSROOT \
-I${HEADER_SEARCH_PATH} \
-c ${FILE_NAME}.m -o ${FILE_NAME}.o

echo "-----開始進入StaticLibrary"
pushd ./StaticLibrary

clang -x objective-c \
-target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot $SYSROOT \
-c TestExample.m -o TestExample.o

ar -rc libTestExample.a TestExample.o
echo "-----開始退出StaticLibrary"
popd

echo "-----開始test.o to test EXEC"
clang -target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot $SYSROOT \
-L./StaticLibrary \
-lTestExample \
${FILE_NAME}.o -o ${FILE_NAME}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抖格,隨后出現(xiàn)的幾起案子诺苹,更是在濱河造成了極大的恐慌,老刑警劉巖雹拄,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件收奔,死亡現(xiàn)場離奇詭異,居然都是意外死亡滓玖,警方通過查閱死者的電腦和手機筹淫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人损姜,你說我怎么就攤上這事饰剥。” “怎么了摧阅?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵汰蓉,是天一觀的道長。 經(jīng)常有香客問我棒卷,道長顾孽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任比规,我火速辦了婚禮若厚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜒什。我一直安慰自己测秸,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布灾常。 她就那樣靜靜地躺著霎冯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钞瀑。 梳的紋絲不亂的頭發(fā)上沈撞,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音雕什,去河邊找鬼缠俺。 笑死,一個胖子當著我的面吹牛贷岸,可吹牛的內(nèi)容都是我干的晋修。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凰盔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了倦春?” 一聲冷哼從身側(cè)響起户敬,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睁本,沒想到半個月后尿庐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡呢堰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年抄瑟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枉疼。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡皮假,死狀恐怖鞋拟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惹资,我是刑警寧澤贺纲,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站褪测,受9級特大地震影響猴誊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侮措,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一懈叹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧分扎,春花似錦澄成、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庵佣,卻和暖如春歉胶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巴粪。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工通今, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肛根。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓辫塌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親派哲。 傳聞我的和親對象是個殘疾皇子臼氨,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容