g++鏈接時指定運行時庫搜索路徑runtime library search path


Linux 指定動態鏈接庫路徑

問題:

想要指定運行時搜索的動態鏈接庫目錄。

g++ -Lpath -llibname 僅僅只能指定好編譯時所依賴的庫,不能在運行時找到所指定的目錄。

解決:

g++ -Wl,-rpath,linkpath 可以通過g++來使用linker的命令參數。

g++ -wl是gcc程序的命令。

-Wl,option 傳遞一個option給linker。 如果option中包含一個逗號(,),將會以逗號為分割點,分割出多個option。你能用這個語法傳遞一個實參(argument)給option。

例如:

-Wl, -Map,out.map 將會傳遞-Map out.map 給linker。當使用GNU linker時,鍵入-Wl,-Map=out.map你也能獲得同樣的效果

linker option

-rpath dir 添加一個目錄到運行時庫搜索目錄(the runtime library search path),這個是用shared objects鏈接一個ELF執行文件。所有-rapth實參將被級聯(concatenated),並傳遞給運行時用來定位shared objects的linker(runtime linker)。

當定位shared object明確include到the link的shared objects -rpath選項;這種用法詳情請看-rpath-link option。等linking一個ELF可執行文件時,-rpath沒有使用,如果定義了環境變量LD_RUN_PATH,這個環境變量將會被使用。

-rpath或許也會被用到Sun OS上。在SunOs上默認,在所有給定-L option 之外,linker會形成一個運行時搜索補丁(patch)。如果-rpath選項被使用,運行時搜索路徑就只會用-rpath option指定的,而忽略-L option。

或許添加多個-L option路徑在NFS mounted Filesystems,使用gcc這將會十分有用。為了與其他ELF linkers保持好的兼容性(compatibility),如果 -R option 后面跟個目錄(dir name),而不是一個文件名,這個option將會被當做-rpath option。

例子:

#|--processFile
#|-----main.o // include "Poco::Foundation" libPocoFoundation.so.31 file in /opt/mker/poco/lib

$g++ -o main main.o -L/opt/mker/poco/lib -lPocoFoundation -Wl,-rpath,/opt/mker/poco/lib

$./main
ok

 

Linux /etc/ld.so.conf 文件在動態加載過程的作用 >>TODO

Reference.

Link option

https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html

https://opensource.com/article/20/6/linux-libraries


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM