日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编译参数-Wl和rpath的理解

發布時間:2023/12/15 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编译参数-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 linker

rpath的說明

  • 參考: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的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。