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