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.
https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html