2013-04-07 64 views
2

當我讀共享庫時,這些疑惑開始向我提出。如何更改已編譯的二進制文件的lib版本

1. .----------------- -------------------------- 假設我已經編譯如下圖所示,

test : main.o libtest.so.2 
    gcc main.o -L ../../lib -ltest -o test 
libtest.so.2 : version2.c 
    gcc -Wall -fPIC -c version2.c 
    gcc -shared -Wl,-soname,libtest.so -o libtest.so.2.0 version2.o 
    ln -sf libtest.so.2.0 libtest.so 
    mv libtest.s* ../../lib 
main.o : main.c 
    gcc -c main.c 

已經給出-ltest,圖書館應始終成爲libtest.so的軟鏈接。正確嗎? 那麼,如果我爲另一個二進制文件尋找更高版本的libtest,而前者需要它的舊版本呢?我該如何處理。

2 .-------------------------------------------- ----------------------------- 我有幾個庫,我不希望將它們包含在LD_LIBRRAY_PATH中,因爲每個人都必須搜索這個與他們完全相關的文件夾。

回答

0

1.You必須-soname集版本:

gcc -shared -Wl,-soname,libtest.so.2 -o libtest.so.2.0 version2.o 

然後連接器將結合前與 「libtest.so.2」,而不是libtest.so的 「任何版本」。


2.設置LD_LIBRARY_PATH纔剛剛開始您的應用程序時,您可以創建shell腳本:

LD_LIBRARY_PATH=/path/to/your/libs ./my_app 
+0

答案2我很清楚。 tx 對於我的問題是,如果我以前面展示的方式編譯,因爲我沒有期望升級,後來我去更新。我同意你的回答,如果我重新編譯main,我可以像下面這樣做,對嗎? gcc -shared -Wl,-soname,libtest.so.2 -o libtest.so.2.0 version2.o – adarsh 2013-04-07 19:11:39

+0

符號鏈接「libtest.so」 - >「libtest.so.2.0」僅供開發使用。當你的應用程序鏈接到「libtest.so」鏈接器時,作者依賴性會從「libtest.so.2.0」的soname中獲得。它將是「libtest.so.2」。當你開始你的應用程序加載器將搜索你需要什麼庫,並會發現「libtest.so.2」(符號鏈接或真正的lib),也可以指向任何「libtest.so.2.X」(這是二進制 - 兼容)。當你創建「libtest.so.3.0」時,前者仍然會與「libtest.so.2」鏈接。 – loentar 2013-04-07 19:18:52

+0

有沒有編譯的工作。 – adarsh 2013-04-07 19:20:18