我會用一個簡單的例子來解釋我的情況。gcc中的相對路徑鏈接
我有兩個 libme.so文件有不同的實現,我已經驗證他們可以同時在一個設計中工作。一個位於./root/v1/,另一個位於./root/v2/
我的「main」.so文件與這兩個libme.so文件相鏈接,位於./root /libtest.so
現在我有要求重新定位的要求。也就是說,如果我將整個「根」目錄複製到另一個位置或甚至另一臺計算機(假設二進制兼容),事情應該仍然可以正常工作。
我的問題是,爲了使這項工作,我應該用什麼gcc命令行來構建libtest.so?
我試過有以下兩種:
(1)(假設我在 「根」 目錄)
>gcc -shared -o libtest.so ./v1/libme.so ./v2/libme.so
這將使libtest.so同時具有與2點鏈接的依賴絕對路徑。這可以通過ldd驗證:
>ldd libtest.so
/home/design/root/v1/libme.so
/home/design/root/v2/libme.so
顯然路徑是固定的。所以一旦我重新定位了「根」目錄,它在運行時就找不到libme.so。注意,在這種情況下,LD_LIBRARY_PATH不起作用,因爲ldd的路徑是絕對路徑。運行器加載器不會搜索LD_LIBRARY_PATH以查找libme.so。
(2)
>gcc -shared -o libtest.so -lme -L./v1 -L./v2
如果我們有libme.so的單一版本這隻會工作。在這種情況下,./v2中的版本不會被鏈接到。-rpath存在同樣的問題。
鑑於此,我還有哪些其他選擇?
注意有一些限制: (1)不能重命名libme.so到其他名稱,如libme_v1.so (2)libtest.so有兩個版本libme.so
這是哪個操作系統?用Linux(至少是我使用的鏈接器)與相對路徑鏈接是好的 – teppic
它是Linux,rhel 5/6。如果你像(1)一樣執行相同的gcc命令,你會從ldd獲得相同的樣式輸出嗎?如果不是,你能告訴我你的gcc命令和ldd的輸出嗎?謝謝。 – michael6866
也許這是鏈接器版本?我正在使用最新的Ubuntu。當我鏈接到上面的目錄時,ldd給了我'../liba.so.1.0(0x00007f39c0226000)' – teppic