编译参数-Wl和rpath的理解
-Wl參數的理解
gcc的-Wl,xxx選項將逗號分隔的標記列表作為空格分隔的參數列表傳遞給鏈接器,即:
gcc -Wl,aaa,bbb,ccc最終變成了linker的用法:
ld aaa bbb ccc如果是想把ld -rpath通過-Wl傳遞給gcc,可以是-Wl,-rpath,xxx,也可以指定-Wl的重復實例:
gcc -Wl,aaa -Wl,bbb -Wl,ccc類似的參數
-Wa,<options> Pass comma-separated <options> on to the assembler-Wp,<options> Pass comma-separated <options> on to the preprocessor-Wl,<options> Pass comma-separated <options> on to the linkerrpath的說明
- 參考:https://stackoverflow.com/questions/13617137/what-is-the-difference-between-ld-library-path-and-rpath
the -rpath option encodes the path in the binary, either as DT_RPATH or DR_RUNPATH
通常,您不需要它,事實上,最好不要在可執行文件中對庫搜索路徑進行編碼(使用-rpath選項將路徑編碼為二進制,可以是DT_rpath或DR_RUNPATH)
注:我自己的一般方法是在可執行文件位于構建樹中,并依賴于構建樹中的其他庫時,將其與–rpath選項鏈接,以便于調試,但在安裝(make install,building packages)時,需要在不使用–rpath選項的情況下重新鏈接,并將查找共享庫的任務留給目標平臺的適當動態鏈接器配置,例如ld.so.conf。
我的問題
在GStreamer插件注冊時候發現依賴的libgstaudiosink.so找不到,而實際上系統上是有的,檢查環境變量后發現和rpath配置有關。
(gst-plugin-scanner:20804): GStreamer-WARNING **: 14:35:57.201: Failed to load plugin '/usr/lib/gstreamer-1.0/libgstwestonsink.so': libgstaudiosink.so: cannot open shared object file: No such file or directory加上-Wl到LDFLAGS后編譯運行,發現就可以了。
rpath參數的寫法
這里面-Wl,-rpath -Wlrpath后面是沒有逗號的,這是-Wl的另外一種寫法:
-Wl,-rpath -Wl,/usr/lib/gstreamer-1.0寫成下面這樣是錯的:
-Wl,rpath,/usr/lib/gstreamer-1.0完整的LDFLAGS如下:
export LDFLAGS="${LDFLAGS} -lgstaudiosink -L${SYSROOT}/usr/lib/gstreamer-1.0 -L${SYSROOT}/usr/lib/gstreamer-1.0 -Wl,-rpath -Wl,/usr/lib/gstreamer-1.0"這樣libgstwestonsink加載的時候就能順利找到libgstaudiosink.so了,所以-Wl,-rpath -Wl,/usr/lib/gstreamer-1.0指定了運行時的so搜索路徑。
通過測試發現,-Wl,-rpath下面這三種寫法都是可以的:
-Wl,-rpath -Wl,/usr/lib/gstreamer-1.0 -Wl,-rpath,/usr/lib/gstreamer-1.0 -Wl,-rpath=/usr/lib/gstreamer-1.0鏈接選項和路徑
現代連接器在處理動態庫時將鏈接時路徑(Link-time path)和運行時路徑(Run-time path)分開,用戶可以通過-L指定連接時庫的路徑,通過-R(或-rpath)指定程序運行時庫的路徑,大大提高了庫應用的靈活性。
鏈接器ld的選項有 -L,-rpath 和 -rpath-link,看了下 man ld,大致是這個意思:
-L: “鏈接”的時候,去找的目錄,也就是所有的 -l 選項里的庫,都會先從 -L 指定的目錄去找,然后是默認的地方。編譯時的-L選項并不影響環境變量LD_LIBRARY_PATH,-L只是指定了程序編譯連接時庫的路徑,并不影響程序執行時庫的路徑,系統還是會到默認路徑下查找該程序所需要的庫,如果找不到,還是會報錯,類似cannot open shared object file。
-rpath-link:這個也是用于“鏈接”的時候的,例如你顯示指定的需要 FOO.so,但是 FOO.so 本身是需要 BAR.so 的,后者你并沒有指定,而是 FOO.so 引用到它,這個時候,會先從 -rpath-link 給的路徑里找。
-rpath: “運行”的時候,去找的目錄。運行的時候,要找 .so 文件,會從這個選項里指定的地方去找。對于交叉編譯,交叉編譯鏈接器需已經配置 –with-sysroot 選項才能起作用。也就是說,-rpath指定的路徑會被記錄在生成的可執行程序中,用于運行時查找需要加載的動態庫。
參考
動態庫的鏈接和鏈接選項-L,-rpath-link,-rpath
I don’t understand -Wl,-rpath -Wl,
總結
以上是生活随笔為你收集整理的编译参数-Wl和rpath的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Word 2016 撰写论文(3): 文
- 下一篇: 【AD16】PCB过孔盖油