最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(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ó)家法律
化州市| 师宗县| 保山市| 息烽县| 清原| 湘潭县| 高陵县| 湘潭市| 北票市| 清徐县| 海南省| 江城| 大同市| 湖州市| 于田县| 蕉岭县| 韶关市| 乾安县| 锦屏县| 古浪县| 盘锦市| 鄱阳县| 彭泽县| 泾源县| 敦化市| 罗山县| 福海县| 阳山县| 郸城县| 平塘县| 大丰市| 汝南县| 娄烦县| 金昌市| 田东县| 乐平市| 新和县| 垫江县| 拜城县| 绥中县| 新乐市|