C/C++編程筆記:C++ 的鏈接問(wèn)題,如何鏈接動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)
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í)視頻分享:
