2015-02-06 90 views
1

安裝Opencv 2.4.9後,我發現它在/ usr/local/lib中創建了許多符號鏈接。說,對於libopencv_core.so.2.4.9,當我使用ls -l,這表明爲什麼這麼多符號鏈接?

... 
libopencv_core.so -> libopencv_core.so.2.4 
libopencv_core.so.2.4 -> libopencv_core.so.2.4.9 
libopencv_core.so.2.4.9 
... 

我的問題是,因爲它已經把真正的共享庫libopencv_core.so.2.4.9在/ usr /的lcoal/lib,爲什麼還要爲它創建一個符號鏈接,甚至是另一個符號鏈接的符號鏈接?

將真正的共享庫放在其他位置並在/ usr/local/lib中爲它們創建符號鏈接會更好嗎?

+1

搜索條件:「soname」 – Angew 2015-02-06 12:40:48

+0

如果您安裝了多個版本並使用需要不同版本的應用程序,這會更加明顯。 – molbdnilo 2015-02-06 12:59:54

回答

0

第二個libopencv_core.so.2.4(alias「soname」)和第三個libopencv_core.so.2.4.9(alias「real name」)文件是允許您更新庫(在這種情況下爲OpenCV)和仍然支持那些想要使用這些庫的舊版本的程序。

$ LDD的a.out
libopencv_core.so.2.4 => /path/to/lib/libopencv_core.so.2.4

運行ldd,你可以看到,可執行未連結到「真名」圖書館? 原因:處理庫升級。考慮兩種情況。

  1. ,並且向後兼容=>安裝(或ldconfig)庫升級可以更新現有的「SONAME」鏈接(例如libopencv_core.so.2.4)指向新的「實名」庫(如libopencv_core.so。 2.4.10),我們較早的可執行文件現在將加載升級後的庫。
  2. 沒有向後兼容性的庫升級=>安裝程序將創建新的「soname」鏈接(例如libopencv_core.so.3.0)以指向新的「realname」庫(例如libopencv_world.so.3.0.0)。此處構建的程序可能會鏈接到較新的庫,而較舊的程序將繼續加載較舊的soname指向的庫(libopencv_core.so.2.4)。

關於,libopencv_core.so(別名「鏈接名稱」)的第一個符號鏈接是爲連接器。對於像-lopencv_core這樣的標誌,gcc前綴lib並將後綴.so添加到庫名稱和搜索中。所以它期望一個名爲libopencv_core.so的文件,因此需要第一個符號鏈接。它在程序運行期間從不使用。另外,如果願意將「soname」鏈接作爲gcc命令行參數而不是-lopencv_core,則永遠不需要此軟鏈接。

這裏更好地解釋(1)。

3

這是一個在Linux系統上很常用的程序,因爲它允許你改變最後版本的.so(在你的情況下爲.so.2.4.9),而只運行的應用程序知道他們需要鏈接第一個.so。

所以所有程序都加載第一個.so然後通過符號鏈接加載當前安裝的版本。

如果它像你提出的那樣(只是複製hard.so),那麼所有的程序都會抱怨他們沒有找到合適的版本(2.4.9)。也許將來你會升級你的openCV到2.4.10,所有的程序都將停止工作。

一些項目實際上強制鏈接到某些主要或中等版本。例如,如果您只保證您的程序可以用於2.4版本,則將其鏈接到.so.2.4而不是.so。

最後它只是幫助分配兼容性。