2013-03-28 140 views
3

我會用一個簡單的例子來解釋我的情況。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

+0

這是哪個操作系統?用Linux(至少是我使用的鏈接器)與相對路徑鏈接是好的 – teppic

+0

它是Linux,rhel 5/6。如果你像(1)一樣執行相同的gcc命令,你會從ldd獲得相同的樣式輸出嗎?如果不是,你能告訴我你的gcc命令和ldd的輸出嗎?謝謝。 – michael6866

+0

也許這是鏈接器版本?我正在使用最新的Ubuntu。當我鏈接到上面的目錄時,ldd給了我'../liba.so.1.0(0x00007f39c0226000)' – teppic

回答

0

Teppic的是鏈接對。這原來只是我的一臺機器上發生的問題。切換到另一臺RHEL5.8機器,我都準備好了。它看起來像原來的機器安裝了一個由某人定製的鏈接器。