日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux下动态库使用小结

發(fā)布時(shí)間:2023/12/1 linux 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux下动态库使用小结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的基本概念

靜態(tài)庫(kù),是在可執(zhí)行程序連接時(shí)就已經(jīng)加入到執(zhí)行碼中,在物理上成為執(zhí)行程序的一部分;使用靜態(tài)庫(kù)編譯的程序運(yùn)行時(shí)無需該庫(kù)文件支持,哪里都可以用,但是生成的可執(zhí)行文件較大。動(dòng)態(tài)庫(kù),是在可執(zhí)行程序啟動(dòng)時(shí)加載到執(zhí)行程序中,可以被多個(gè)可執(zhí)行程序共享使用。使用動(dòng)態(tài)庫(kù)編譯生成的程序相對(duì)較小,但運(yùn)行時(shí)需要庫(kù)文件支持,如果機(jī)器里沒有這些庫(kù)文件就不能運(yùn)行。


2. ?如何使用動(dòng)態(tài)庫(kù)

如何程序在連接時(shí)使用了共享庫(kù),就必須在運(yùn)行的時(shí)候能夠找到共享庫(kù)的位置。linux的可執(zhí)行程序在執(zhí)行的時(shí)候默認(rèn)是先搜索/lib和/usr/lib這兩個(gè)目錄,然后按照/etc/ld.so.conf里面的配置搜索絕對(duì)路徑。同時(shí),Linux也提供了環(huán)境變量LD_LIBRARY_PATH供用戶選擇使用,用戶可以通過設(shè)定它來查找除默認(rèn)路徑之外的其他路徑,如查找/work/lib路徑,你可以在/etc/rc.d/rc.local或其他系統(tǒng)啟動(dòng)后即可執(zhí)行到的腳本添加如下語句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路徑優(yōu)先于系統(tǒng)默認(rèn)路徑之前查找(詳細(xì)參考《使用LD_LIBRARY_PATH》)。


不過LD_LIBRARY_PATH的設(shè)定作用是全局的,過多的使用可能會(huì)影響到其他應(yīng)用程序的運(yùn)行,所以多用在調(diào)試。(LD_LIBRARY_PATH的缺陷和使用準(zhǔn)則,可以參考《Why LD_LIBRARY_PATH is bad》 )。通常情況下推薦還是使用gcc的-R或-rpath選項(xiàng)來在編譯時(shí)就指定庫(kù)的查找路徑,并且該庫(kù)的路徑信息保存在可執(zhí)行文件中,運(yùn)行時(shí)它會(huì)直接到該路徑查找?guī)?#xff0c;避免了使用LD_LIBRARY_PATH環(huán)境變量查找。

3.庫(kù)的鏈接時(shí)路徑和運(yùn)行時(shí)路徑

現(xiàn)代連接器在處理動(dòng)態(tài)庫(kù)時(shí)將鏈接時(shí)路徑(Link-time path)和運(yùn)行時(shí)路徑(Run-time path)分開,用戶可以通過-L指定連接時(shí)庫(kù)的路徑,通過-R(或-rpath)指定程序運(yùn)行時(shí)庫(kù)的路徑,大大提高了庫(kù)應(yīng)用的靈活性。比如我們做嵌入式移植時(shí)#arm-linux-gcc $(CFLAGS) –o target ?–L/work/lib/zlib/ -llibz-1.2.3 ?(work/lib/zlib下是交叉編譯好的zlib庫(kù)),將target編譯好后我們只要把zlib庫(kù)拷貝到開發(fā)板的系統(tǒng)默認(rèn)路徑下即可。或者通過-rpath(或-R )、LD_LIBRARY_PATH指定查找路徑。


小問題:


1.編譯時(shí)的-L選項(xiàng)是否影響LD_LIBRARY_PATH的值?

舉一個(gè)實(shí)例:
當(dāng)前文件夾結(jié)構(gòu)如下:
test.c tools/
tool下有tool.c tool.h my_err.h 以及由此生成的libtool.so
tool下編譯生成庫(kù)文件
gcc -Wall -g -shared -o tool.so tool.c

在當(dāng)前文件夾引用:
gcc -Wall -g –o ?test.c -Ltools -ltool
編譯不報(bào)錯(cuò),但是運(yùn)行加載的時(shí)候就出現(xiàn)cannot open shared object file。
如果將該庫(kù)文件拷貝到/usr/lib下就沒有錯(cuò)誤,正常運(yùn)行。

說明編譯時(shí)的-L選項(xiàng)并不影響環(huán)境變量LD_LIBRARY_PATH,-L只是指定了程序編譯連接時(shí)庫(kù)的路徑,并不影響程序執(zhí)行時(shí)庫(kù)的路徑,系統(tǒng)還是會(huì)到默認(rèn)路徑下查找該程序所需要的庫(kù)。


?

轉(zhuǎn)載于:https://www.cnblogs.com/xinyuyuanm/archive/2013/05/11/3073109.html

總結(jié)

以上是生活随笔為你收集整理的Linux下动态库使用小结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。