国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

C/C++編程筆記:C++ 的鏈接問(wèn)題,如何鏈接動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)

2020-11-03 16:30 作者:C語(yǔ)言編程__Plus  | 我要投稿

C++的鏈接分為兩部分,一個(gè)是編譯時(shí),一個(gè)是運(yùn)行時(shí)。但運(yùn)行時(shí)的行為也收到編譯參數(shù)的影響。

1.?編譯時(shí)鏈接

基本就兩個(gè)參數(shù),-l?和-L?:

-l?編譯時(shí)要鏈接的庫(kù)(包括動(dòng)態(tài)鏈接庫(kù).so?和靜態(tài)鏈接庫(kù).a?),注意庫(kù)的順序,被依賴的放在后面。

-L?查詢鏈接庫(kù)的位置,編譯器將依次查找。(/usr/lib?之類的系統(tǒng)位置不用寫)。

一個(gè)例子:

g++ ...-lfolly-lboost_system -L /opt/lib


2.?運(yùn)行時(shí)鏈接

編譯時(shí),靜態(tài)鏈接庫(kù).a?文件將直接被合并,因此運(yùn)行時(shí)鏈接只涉及動(dòng)態(tài)鏈接庫(kù).so?文件。

執(zhí)行l(wèi)dd your_file?可以查看指定文件運(yùn)行時(shí)所需要鏈接的文件以及是否鏈接到指定位置。如果出現(xiàn)Not found?或者鏈接到不正確位置,需要考察以下兩個(gè)設(shè)置對(duì)象。

2.1.?系統(tǒng)環(huán)境變量LD_LIBRARY_PATH

鏈接程序首先考慮系統(tǒng)的環(huán)境變量LD_LIBRARY_PATH?,從這里面設(shè)置的目錄列表依次查找所需要的庫(kù)文件。

下面命令可以查看當(dāng)前設(shè)置的(用:隔開(kāi)的)目錄列表:

echo$ LD_LIBRARY_PATH

下面命令可以設(shè)置該列表:

export LD_LIBRARY_PATH=~/lib:$LD_LIBRARY_PATH

注意將自己的目錄放在最前面,多個(gè)目錄用:?隔開(kāi),并且包含原有的$LD_LIBRARY_PATH?,以免破壞其它程序的設(shè)置。

該命令設(shè)置只會(huì)對(duì)當(dāng)前窗口有效,新開(kāi)窗口需要重新設(shè)置。如果需要總是有效,可考慮下面方法:

如果想對(duì)所有用戶生效,可放在/etc/environment?文件里(需 ROOT 權(quán)限)。

如果想對(duì)當(dāng)前用戶生效,可放在~/.bashrc?或者~/.zshrc?等啟動(dòng)配置文件。



2.2.?程序內(nèi)置參數(shù)RUNPATH

如果鏈接程序在系統(tǒng)環(huán)境變量LD_LIBRARY_PATH?找不到指令的庫(kù),此時(shí)會(huì)參考程序內(nèi)置參數(shù)RUNPATH?。下面命令可以查看該設(shè)置:

readelf -d your_file | grep RUNPATH

這個(gè)參數(shù)的設(shè)置在編譯環(huán)節(jié),即常見(jiàn)的-Wl,rpath?:

g++...-Wl,rpath=dir1 -Wl,rpath=dir2

2.3.?程序內(nèi)置參數(shù)DT_RPATH

內(nèi)置參數(shù)DT_RPATH?是很老的-Wl,rpath?行為,現(xiàn)在已經(jīng)改成了RUNPATH?。DT_RPATH?的區(qū)別在于它的優(yōu)先級(jí)還在系統(tǒng)設(shè)置LD_LIBRARY_PATH?之前。下面命令可查看該設(shè)置

readelf -d your_file | grep DT_RPATH

設(shè)置方法為-Wl,rpath?配上-Wl,disable-new-dtags?選項(xiàng):

g++ ... -Wl,rpath=dir1 -Wl,rpath=dir2 -Wl,disable-new-tags


2.4.?還是找不到庫(kù)?

有時(shí)候,通過(guò)上面方法設(shè)置了合適的路徑和參數(shù),查看路徑和參數(shù)也都正常,但還是提示找不到,比如報(bào)「libboost_thread.so.xxx.xxx.xxx: cannot open shared object file: No such file or directory」錯(cuò)誤。

我碰到的一次,解決方法是執(zhí)行:

sudo ldconfig /opt/lib/

其中/opt/lib?換成你的 boost 的安裝路徑。本質(zhì)是通過(guò)ldconfig?刷新緩存。

另外如果你想更好的提升你的編程能力,學(xué)好C語(yǔ)言C++編程!彎道超車,快人一步!

分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!

學(xué)習(xí)C/C++編程知識(shí),提升C/C++編程能力,歡迎關(guān)注UP一起來(lái)成長(zhǎng)!
另外,UP在主頁(yè)上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~

編程學(xué)習(xí)書(shū)籍分享:


編程學(xué)習(xí)視頻分享:



C/C++編程筆記:C++ 的鏈接問(wèn)題,如何鏈接動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
平南县| 凌云县| 苗栗市| 澎湖县| 靖西县| 调兵山市| 仪陇县| 延津县| 思茅市| 成安县| 永昌县| 桂平市| 奇台县| 青神县| 即墨市| 仪陇县| 富阳市| 岳普湖县| 崇左市| 新绛县| 思南县| 长汀县| 博湖县| 太康县| 昌吉市| 东城区| 乌拉特中旗| 建昌县| 盐源县| 普兰店市| 高邮市| 临沧市| 黑山县| 平江县| 秦皇岛市| 平乐县| 汉阴县| 突泉县| 商河县| 通榆县| 鄄城县|