2013-02-05 51 views
4

我在這裏搜索這個問題,並找到一些類似的問題,但有解決方案不適合我。這是我的問題: 我的應用程序正在使用openldap-2.3的共享庫進行編譯。 Openldap的/usr/lib/libldap-2.3.so.0鏈接到/usr/lib/libldap-2.3.so.0.2.31。我將-lldap選項傳遞給gcc,它將libldap-2.3.so.0文件鏈接到我的應用程序。如何鏈接特定名稱(版本)的共享庫

但我想鏈接像libldap.so這樣的特定名稱。 請改正我,將來如果我在開發系統中將openldap版本更改爲2.4,則它將鏈接到libldap-2.4.so.XXX版本。

那麼我怎樣才能將我的應用程序鏈接到特定的名稱,以便它會一直尋找像libldap.so一樣的名稱。

注:我創建/usr/lib/libldap-2.3.so.0的軟鏈接作爲/usr/lib/libldap.so,然後通過庫名/usr/lib/libldap.so沒有-l編譯器,然後應用程序編譯成功,而不任何鏈接錯誤,但依然顯示相同的libldap-2.3.so.0。

+1

在未來,如果您更改庫,您可以將鏈接更改爲指向新鏈接,是不是會解決問題? – iabdalkader

+1

只是一個猜測 - 所以沒有可能與一些普通圖書館鏈接。它總是需要與特定版本的庫鏈接。如果您更改系統,則需要重新構建應用程序。另一種可能性不是鏈接到共享庫,而是使「靜態」應用程序 – xhudik

+0

@mux我在gcc中使用「-l」選項,因此它會將我的應用程序鏈接到libldap-2.4.so.0等新庫,但它會詢問在我運行我的應用程序的系統中使用相同的名稱。我想要修復。 – linuxexplore

回答

1

Unix中的shared library mechanism(該鏈接很古老,但仍然相關)通過在構建時將可執行文件鏈接到例如liba.so,它是liba.so.1的一個符號鏈接,它又是鏈接到liba.so.1.2的鏈接。然後可執行文件記錄liba.so.1以在啓動時加載。如果你更新liba.so,它可能是liba.so.1.5(沒有ABI更改,第一位數字不會更改),鏈接看起來像liba.so - > liba.so.1 - > liba.so .1.5,並且您的可執行文件現在透明地使用1.5。如果版本轉到liba.so.2.0(API更改!),則系統將使liba.so - > liba.so.2 - > liba.so.2.0。您的舊可執行文件仍然使用1.5,任何新建立的程序現在都會引用2.所有這些工作只要1.x一直存在,顯然。假設您的發行版提供了可以並行安裝的庫軟件包,或者爲了舊的可執行文件而使用某些compat-liba-1軟件包。