一、什么是庫(kù)?
庫(kù)是一種可執(zhí)行代碼的二進(jìn)制形式,可以被操作系統(tǒng)載入內(nèi)存執(zhí)行。就是將源代碼轉(zhuǎn)化為二進(jìn)制格式的源代碼,相當(dāng)于進(jìn)行了加密,別人可以使用庫(kù),但是看不到庫(kù)中的內(nèi)容。
常見的庫(kù)類型
共享庫(kù) 靜態(tài)庫(kù) 動(dòng)態(tài)庫(kù)
win32平臺(tái)下,靜態(tài)庫(kù)通常后綴為.lib,動(dòng)態(tài)庫(kù)為.dll 。
linux平臺(tái)下,靜態(tài)庫(kù)通常后綴為.a,動(dòng)態(tài)庫(kù)為.so 。
?
二、靜態(tài)庫(kù) 、動(dòng)態(tài)庫(kù)
所謂靜態(tài)庫(kù),就是在靜態(tài)編譯時(shí)由編譯器到指定目錄尋找并且進(jìn)行鏈接,一旦鏈接完成,最終的可執(zhí)行程序中就包含了該庫(kù)文件中的所有有用信息,包括代碼段、數(shù)據(jù)段等。
相對(duì)于動(dòng)態(tài)庫(kù),靜態(tài)庫(kù)的優(yōu)點(diǎn)在于直接被鏈接進(jìn)可執(zhí)行程序中,之后,該可執(zhí)行程序就不再依賴于運(yùn)行環(huán)境的設(shè)置了(當(dāng)然仍然會(huì)依賴于 CPU指令集和操作系統(tǒng)支持的可執(zhí)行文件格式等硬性限制)。
所謂動(dòng)態(tài)庫(kù),就是在應(yīng)用程序運(yùn)行時(shí),由操作系統(tǒng)根據(jù)應(yīng)用程序的請(qǐng)求,動(dòng)態(tài)到指定目錄下尋找并裝載入內(nèi)存中,同時(shí)需要進(jìn)行地址重定向。
而動(dòng)態(tài)庫(kù)的優(yōu)點(diǎn)在于,用戶甚至可以在程序運(yùn)行時(shí)隨時(shí)替換該動(dòng)態(tài)庫(kù),這就構(gòu)成了動(dòng)態(tài)插件系統(tǒng)的基礎(chǔ)。具體使用靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù),由程序員根據(jù)需要自己決定。
另外,需要說(shuō)明的一點(diǎn)是,從底層實(shí)現(xiàn)上,動(dòng)態(tài)庫(kù)的效率可能會(huì)比靜態(tài)庫(kù)稍差一點(diǎn)點(diǎn),注意,這里用了“可能”二字,具體差不差,還得看寫程序的人。之所以可能會(huì)差,主要原因在于,程序總無(wú)法直接調(diào)用動(dòng)態(tài)庫(kù)中的函數(shù)符號(hào),而只能通過(guò)調(diào)用操作系統(tǒng)的runtime enviroment接口來(lái)動(dòng)態(tài)載入某個(gè)函數(shù)符號(hào),同時(shí)獲得該函數(shù)符號(hào)在內(nèi)存中的地址,將其保存為函數(shù)指針進(jìn)行調(diào)用,這就在函數(shù)調(diào)用時(shí)增加了一次間接尋址的過(guò)程。
三、庫(kù)的制作和使用
1、靜態(tài)庫(kù)的制作:? 格式xxxx.a
生成xxx.o文件? ? ? ??gcc calcufuncs.c –c??
使用?ar?命令? ??xxx.o文件生成xxx.a靜態(tài)庫(kù)文件? ? ? ? ar rcs libcalcufunc.a calcufuncs.o??
靜態(tài)庫(kù)的使用
gcc calculator.c -lcalcufunc -L ./ -o mainProStatic
???????? -lcalcufunc? –l是指定要用的靜態(tài)庫(kù),庫(kù)名砍頭去掉lib去尾去掉.a
? ? ? ???-L ./? 告訴gcc編譯器從-L指定的路徑去找靜態(tài)庫(kù),默認(rèn)是從/usr/lib/usr/local/lib去找
2、動(dòng)態(tài)庫(kù)的制作????????????? 生成xxx.so文件
gcc -shared -fpic calcufuncs.c -o libcalc.so
-shared 指定生成動(dòng)態(tài)庫(kù)
-fpic? 標(biāo)準(zhǔn),用于編譯階段,在生成目標(biāo)文件時(shí)就得使用該選項(xiàng)。以生成位置無(wú)關(guān)的代碼
動(dòng)態(tài)庫(kù)的使用
gcc calculator.c -lcalc -L ./ -o mainProDy
??動(dòng)態(tài)庫(kù)優(yōu)先從當(dāng)前路徑去找,沒找到的話再去 /usr/lib/ 下去找通常動(dòng)態(tài)庫(kù)拷貝到 /usr/lib/ 下即可:
sudo cp libcalc.so /usr/lib/? ? ? ? ? ? ? ??
動(dòng)態(tài)庫(kù)無(wú)法加載(引用動(dòng)態(tài)庫(kù),怎么指定動(dòng)態(tài)庫(kù)的位置):
臨時(shí)設(shè)置:在終端進(jìn)行:export LD_LIBRARY_PATH=“動(dòng)態(tài)庫(kù)的路徑”
帶動(dòng)態(tài)庫(kù)的程序(可以指定該程序運(yùn)行時(shí)候,在LD_LIBRARY_PATH所指定的路徑去找?guī)煳募?/strong>
或者利用腳本
vi start.sh? ? ?//創(chuàng)建一個(gè).sh文件
export LD_LIBRARY_PATH="/home/pi/test//動(dòng)態(tài)庫(kù)的路徑"
./mianPrody? ?//所要執(zhí)行的程序名稱
//在文件夾中輸入以上內(nèi)容
?chmod +x start.sh? ? ?//給腳本加可執(zhí)行的的權(quán)限
./start.sh? ? ? ? ? ? ? ? ? ? ?//執(zhí)行該腳本文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-437992.html
./mainProDy(用shell腳本運(yùn)行,腳本需要加權(quán)限 chmod +x xxx)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-437992.html
到了這里,關(guān)于動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!