Libraries
是否有動態連結庫的 rpath?
因此,我正在處理的項目使用非系統目錄來保存程式碼使用的一些 DLL。我不想將它們放在系統目錄中,因此執行檔設置了一個 rpath 來查找 DLL。但是,隨著越來越多的庫被添加,現在有依賴於該目錄中其他 DLL 的 DLL。
這些庫找不到它們所依賴的 DLL,因為它們不在連結器正在尋找的目錄中,例如係統目錄。
有沒有辦法讓 DLL 搜尋這個特定的非系統目錄?比如rpath?圖書館是如何做到的?用於該項目的建構系統是 CMake,如果這有助於答案。
這個答案不起作用,因為庫中沒有 rPath 標籤:https ://unix.stackexchange.com/a/272286/4193
我考慮過使用
LD_LIBRARY_PATH
, 並且可行,但是打字很煩人,而且讓其他人使用該應用程序並不是那麼好。如果有辦法將rPath
標籤添加到庫中,那將是最好的選擇。指向以前相關問題和答案的指針表示讚賞。
是否有動態連結庫的 rpath?
就在這裡。您可以
-Wl,-rpath
像使用 ELF 執行檔一樣使用 ELF 共享對象。複製我在 這裡提出的一個小例子:git clone https://gist.github.com/ardrabczyk/6aeb8545c9b754d6b15be390af4bdff0
執行
make
編譯。檢查main
ELF 執行檔需要哪些庫:$ readelf -d ./main Dynamic section at offset 0xe30 contains 22 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libtwo.so] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000000000000f (RPATH) Library rpath: [.] (...)
並檢查需要哪些庫
libtwo.so
:$ readelf -d ./libtwo.so Dynamic section at offset 0xe38 contains 22 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libone.so] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000000000000f (RPATH) Library rpath: [libs] (...)
如您所見,兩者都
main
需要libtwo.so
一些共享對象,並且都設置了 rpath。您無需設置 LD_LIBRARY_PATH 即可執行 ./main:$ ./main I'm in bar()
main 將始終在
.
目前目錄中查找其 libtwo.so 依賴項,而 libtwo.so 反過來將始終在libs
目錄中查找其 libone.so 依賴項。如果libs
缺少 ./main 將無法啟動:$ mv libs libs.bak $ ./main ./main: error while loading shared libraries: libone.so: cannot open shared object file: No such file or directory
恢復它:
$ mv libs.bak libs $ ./main I'm in bar()