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