如何生成靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)?
庫(kù)是由一組目標(biāo)文件聚合而成的文件,目標(biāo)文件通過(guò)源文件編譯得到。對(duì)于C語(yǔ)言,目標(biāo)文件包含了若干數(shù)據(jù)結(jié)構(gòu)和函數(shù),但不能包含main函數(shù)。庫(kù)有兩種類型:靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。靜態(tài)庫(kù)是指在編譯時(shí)將庫(kù)鏈接進(jìn)可執(zhí)行文件
庫(kù)是由一組目標(biāo)文件聚合而成的文件,目標(biāo)文件通過(guò)源文件編譯得到。對(duì)于C語(yǔ)言,目標(biāo)文件包含了若干數(shù)據(jù)結(jié)構(gòu)和函數(shù),但不能包含main函數(shù)。庫(kù)有兩種類型:靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。
靜態(tài)庫(kù)是指在編譯時(shí)將庫(kù)鏈接進(jìn)可執(zhí)行文件中,每次執(zhí)行程序時(shí)都會(huì)使用這個(gè)庫(kù)的一個(gè)副本。動(dòng)態(tài)庫(kù)則在運(yùn)行時(shí)加載進(jìn)內(nèi)存,不會(huì)像靜態(tài)庫(kù)那樣被復(fù)制多份,因此動(dòng)態(tài)庫(kù)可以被多個(gè)程序共享。本文將以gcc工具為例,介紹如何生成靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。
一、如何生成靜態(tài)庫(kù)
1. 準(zhǔn)備兩個(gè)源文件s1.c和s2.c,以及相應(yīng)的頭文件s1.h和s2.h。
2. 從s1.c和s2.c生成靜態(tài)庫(kù)libs12.a:
(1)執(zhí)行指令“gcc -c s1.c s2.c”生成目標(biāo)文件:s1.o、s2.o
(2)執(zhí)行指令“ar cr libs12.a s1.o s2.o”生成靜態(tài)庫(kù):libs12.a
3. 準(zhǔn)備測(cè)試文件main.c并編譯連接靜態(tài)庫(kù)libs12.a:
(1)執(zhí)行指令“gcc -c main.c”生成目標(biāo)文件:main.o
(2)執(zhí)行指令“gcc -o s12.exe main.o libs12.a”生成可執(zhí)行文件s12.exe
(3)執(zhí)行生成的s12.exe可驗(yàn)證成功連接靜態(tài)文件
二、如何生成動(dòng)態(tài)庫(kù)
1. 從s1.c和s2.c生成動(dòng)態(tài)庫(kù):
(1)執(zhí)行指令“gcc -fPIC -shared s1.c s2.c -o ”生成動(dòng)態(tài)庫(kù):
其中-fPIC選項(xiàng)用于告訴編譯器生成與位置無(wú)關(guān)的代碼,這對(duì)于動(dòng)態(tài)庫(kù)非常重要。
2. 編譯測(cè)試文件main.c并鏈接動(dòng)態(tài)庫(kù)
(1)執(zhí)行指令“gcc -c main.c”生成目標(biāo)文件:main.o
(2)執(zhí)行指令“gcc -o s12 main.o -L./ -l s12”生成可執(zhí)行文件s12
其中-L選項(xiàng)用于告訴編譯器在當(dāng)前目錄下查找動(dòng)態(tài)庫(kù),-l選項(xiàng)則指定要鏈接的庫(kù)的名稱,注意此處不需要寫(xiě)上“l(fā)ib”和“.so”后綴。
(3)執(zhí)行生成的s12可驗(yàn)證成功連接動(dòng)態(tài)文件
總結(jié):
生成靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的方法大致相同,只是在編譯時(shí)需要加入不同的參數(shù)。靜態(tài)庫(kù)在編譯時(shí)將庫(kù)鏈接進(jìn)可執(zhí)行文件中,而動(dòng)態(tài)庫(kù)則在運(yùn)行時(shí)加載進(jìn)內(nèi)存,兩者各自的優(yōu)點(diǎn)和缺點(diǎn)需要根據(jù)實(shí)際情況進(jìn)行選擇。