新聞中心
Linux操作系統(tǒng)廣泛應(yīng)用于各種領(lǐng)域,而動(dòng)態(tài)鏈接庫(kù)(Dynamic Linking Library,簡(jiǎn)稱動(dòng)態(tài)庫(kù))是Linux系統(tǒng)中十分重要的一部分,它可以方便地為不同的應(yīng)用程序提供共享代碼,減小程序的體積,提高程序的運(yùn)行效率。加載動(dòng)態(tài)庫(kù)時(shí),Linux系統(tǒng)會(huì)按照一定的順序搜索動(dòng)態(tài)庫(kù)路徑,找到可用的動(dòng)態(tài)庫(kù)后再加載到程序中。因此,掌握動(dòng)態(tài)庫(kù)加載路徑的技巧對(duì)于Linux程序員來(lái)說(shuō)十分必要。本文將介紹一些。

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),杭錦后企業(yè)網(wǎng)站建設(shè),杭錦后品牌網(wǎng)站建設(shè),網(wǎng)站定制,杭錦后網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,杭錦后網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
1. 系統(tǒng)默認(rèn)的動(dòng)態(tài)庫(kù)加載路徑
在Linux系統(tǒng)中,系統(tǒng)默認(rèn)的動(dòng)態(tài)庫(kù)加載路徑一般為/lib和/usr/lib目錄,程序在加載動(dòng)態(tài)庫(kù)時(shí)會(huì)自動(dòng)在這些目錄下搜索。如果需要將自己的動(dòng)態(tài)庫(kù)加入到這些路徑下,可以使用以下命令:
sudo cp libxxx.so /usr/lib/
sudo ldconfig
這樣做可以將動(dòng)態(tài)庫(kù)復(fù)制到/usr/lib目錄下,并更新系統(tǒng)動(dòng)態(tài)庫(kù)緩存。需要注意的是,在進(jìn)行類似操作時(shí)要格外小心,避免誤操作導(dǎo)致系統(tǒng)出現(xiàn)問(wèn)題。
2. 設(shè)置LD_LIBRARY_PATH環(huán)境變量
除了默認(rèn)的動(dòng)態(tài)庫(kù)加載路徑,Linux系統(tǒng)還提供了一種設(shè)置動(dòng)態(tài)庫(kù)加載路徑的方法,即通過(guò)設(shè)置LD_LIBRARY_PATH環(huán)境變量來(lái)指定動(dòng)態(tài)庫(kù)的路徑。例如,如果想將動(dòng)態(tài)庫(kù)path加入到動(dòng)態(tài)庫(kù)加載路徑中,可以使用以下命令:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/
這樣做可以將/path/目錄加入到動(dòng)態(tài)庫(kù)加載路徑中。需要注意的是,設(shè)置LD_LIBRARY_PATH環(huán)境變量時(shí),要避免與系統(tǒng)默認(rèn)的加載路徑相沖突。
3. 應(yīng)用程序中指定動(dòng)態(tài)庫(kù)加載路徑
有些情況下,需要在應(yīng)用程序中指定動(dòng)態(tài)庫(kù)加載路徑,例如如果一個(gè)應(yīng)用程序需要使用不同版本的同名動(dòng)態(tài)庫(kù),就需要在應(yīng)用程序中指定加載路徑。在C/C++程序中,可以使用以下函數(shù)來(lái)指定動(dòng)態(tài)庫(kù)加載路徑:
#include
void* dlopen(const char *filename, int flag);
這里的filename參數(shù)指定動(dòng)態(tài)庫(kù)的文件名(含路徑),flag參數(shù)可以指定加載方式和操作方式(如RTLD_NOW表示立即加載動(dòng)態(tài)庫(kù))。需要注意的是,dlopen加載動(dòng)態(tài)庫(kù)時(shí)會(huì)優(yōu)先搜索當(dāng)前目錄下的動(dòng)態(tài)庫(kù)文件,如果需要使用其他路徑下的文件,必須在文件名前加上路徑。
4. 使用LD_PRELOAD指定預(yù)加載庫(kù)
Linux系統(tǒng)還提供了一個(gè)LD_PRELOAD環(huán)境變量,可以使用它來(lái)指定預(yù)加載庫(kù)。預(yù)加載庫(kù)是指在應(yīng)用程序加載動(dòng)態(tài)庫(kù)之前,先在LD_PRELOAD指定的庫(kù)中查找符號(hào),如果找到則使用預(yù)加載庫(kù)中的符號(hào),否則在默認(rèn)的動(dòng)態(tài)庫(kù)路徑以及應(yīng)用程序指定的路徑中查找。這種方法可以用于在不修改應(yīng)用程序源碼的情況下,替換掉應(yīng)用程序中的函數(shù)實(shí)現(xiàn),具有一定的靈活性。
相關(guān)問(wèn)題拓展閱讀:
- 關(guān)于linux下連接動(dòng)態(tài)庫(kù)問(wèn)題
- linux中如何將動(dòng)態(tài)鏈接庫(kù)嵌入到可執(zhí)行程序
關(guān)于linux下連接動(dòng)態(tài)庫(kù)問(wèn)題
很橋野奇怪的游消塵gcc用法, 鏈接庫(kù)的時(shí)候你應(yīng)該神禪使用選項(xiàng)”-l”來(lái)指定, 而不是像個(gè)c文件一樣直接寫(xiě)在后面.
gcc編譯時(shí),當(dāng)使用動(dòng)態(tài)庫(kù)編譯可以按照幾種寫(xiě)法
1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的編譯參數(shù)都是按照2或3去寫(xiě)
2寫(xiě)法的含義是從/lib或者/usr/lib目錄下尋找名稱為SDL2-2的庫(kù),即尋找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件進(jìn)行鏈接,當(dāng)然如果沒(méi)有動(dòng)態(tài)庫(kù)升咐就會(huì)去找靜態(tài)庫(kù),再?zèng)]有應(yīng)該就會(huì)在編譯時(shí)報(bào)錯(cuò)
3寫(xiě)法的含義是從-L參數(shù)首先從指定的目錄中尋找需要鏈接的庫(kù)文件,隨后再去尋找系統(tǒng)文件夾中是否存在需要的庫(kù)
1寫(xiě)法的含義是將當(dāng)前目錄下的./libSDL2-2.so.0文件鏈接進(jìn)最終文件,因此執(zhí)行readelf -a a.out后在動(dòng)態(tài)庫(kù)部分所看到的路徑就是./libSDL2-2.so.0,進(jìn)而在執(zhí)行文件時(shí)僅會(huì)從當(dāng)前目錄下尋找libSDL2-2.so.0文件,當(dāng)執(zhí)行文件時(shí)所在的目錄下沒(méi)有該文件時(shí)就會(huì)出現(xiàn)找不到庫(kù)文件的操作吵困純
你第二次操作時(shí),因?yàn)閒unction.so庫(kù)文件與a.out文件在同一個(gè)目錄,同時(shí)也是在該目錄下執(zhí)行的ldd操作及運(yùn)行a.out,a.out在加載動(dòng)態(tài)庫(kù)時(shí)從當(dāng)前目錄下找到了所需要的庫(kù)文件,此時(shí)能夠執(zhí)行成功(ldd命令實(shí)質(zhì)是一個(gè)腳本,通過(guò)設(shè)置環(huán)境變量運(yùn)行動(dòng)態(tài)庫(kù)鏈接器來(lái)輸出所有待鏈接的動(dòng)態(tài)庫(kù))。
你可以試試將a.out拷貝至其他目錄再次運(yùn)行,將出現(xiàn)和之一次操作時(shí)一樣的現(xiàn)象,找不到function.so文件。
具體的解決方法就是修改編譯參數(shù),將./libSDL2-2.so.0修改為-lSDL2-2并將libSDL2-2.so.0文件拷貝至/usr/lib目錄下,并且可能因?yàn)闆](méi)有修改鏈接器的緩存文件(將可能找不到帶版本號(hào)后綴的動(dòng)態(tài)庫(kù)),需要在/usr/lib目錄下建立一個(gè)文件連接(ln -s libSDL2-2.so.0 libSDL2-2.so)或尺游者直接修改名稱為libSDL2-2.so
/etc/ld.so.conf 里或者環(huán)境高閉變山搜量里添加庫(kù)路徑,或者要戚唯裂把文件放到/usr/lib這樣的路徑里面,再更新一下ld.so.conf文件
linux中如何將動(dòng)態(tài)鏈接庫(kù)嵌入到可執(zhí)行程序
動(dòng)態(tài)庫(kù)是運(yùn)行時(shí)加載,動(dòng)態(tài)庫(kù)有自己瞎埋的加載路徑;運(yùn)行時(shí)會(huì)從固定路徑敗埋加載;
即需要把動(dòng)態(tài)庫(kù)放到固定路徑下;
比如linux的察神螞/lib/目錄下
linux動(dòng)態(tài)庫(kù)加載 路徑的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux動(dòng)態(tài)庫(kù)加載 路徑,精通Linux動(dòng)態(tài)庫(kù)加載路徑的技巧,關(guān)于linux下連接動(dòng)態(tài)庫(kù)問(wèn)題,linux中如何將動(dòng)態(tài)鏈接庫(kù)嵌入到可執(zhí)行程序的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級(jí)標(biāo)準(zhǔn)機(jī)房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機(jī)柜接入千兆交換機(jī),能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運(yùn)行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認(rèn)可。
網(wǎng)站欄目:精通Linux動(dòng)態(tài)庫(kù)加載路徑的技巧(linux動(dòng)態(tài)庫(kù)加載路徑)
網(wǎng)站鏈接:http://m.fisionsoft.com.cn/article/ccdehic.html


咨詢
建站咨詢
