2017-08-24 61 views
1

在我的lib目錄中,我看到大多數共享對象鏈接是級聯的。例如:C++爲什麼級聯共享對象鏈接

libctest.so.1.0 -> libctest.so.1 
libctest.so.1 -> libctest.so 

我知道libctest.so鏈接是使編譯標誌-lctest工作,但什麼是有libctest.so.1的地步?

回答

1

我覺得你寫的filnames以相反的順序來它是如何正常顯示,你將有3個文件

libctest.so.1.0 (library file) 
libctest.so.1 -> libctest.so.1.0 (symlink to the libctest.so.1.0 file) 
libctest.so -> libctest.so.1  (symlink to the libctest.so.1 symlink 

這是一個版本控制方案。

庫的特定發佈/安裝具有完整的文件名,例如,嵌入在該庫中的是SONAME,該庫的邏輯名稱,例如, libctest.so.1也用作實際文件的符號鏈接。

鏈接可執行文件時,庫SONAME被添加到可執行文件,因此在運行時,可執行文件會查找文件名libctest.so.1。約定是隻要向後兼容,庫的SONAME保持不變,並且在引入向後不兼容的ABI更改時更改它。

正如您所說,鏈接器將在您執行鏈接時查找lib*.so

libctest升級時,鏈接到libctest.so.1的這種方式的可執行文件(或其他庫)可以保持不變。因此,當libctest 1.1版本發佈時,你可能有這些文件:

libctest.so.1.1 
libctest.so.1 -> libctest.so.1.1 
libctest.so -> libctest.so.1 

可執行文件仍然試圖找到libctest.so.1,因此當庫升級保持不變。圖書館必須書寫,以便向後兼容,以便在實際工作中。

如果您發佈一個新的向後不兼容的庫,約定是更改該庫的SONAME,因此最終會出現例如

libctest.so.2.0 
libctest.so.2 -> libctest.so.2.0 

這支持其安裝在系統上,如果不同exeucatbles需要不同版本庫庫的幾個不兼容的版本。

+0

如果實際'so'文件的名稱是'libctest.so.199',我只需要創建一個鏈接'libctest.so - > libctest.so.199',對不對? – user4016367

0

這些數字都是關於版本控制的。這意味着您可以輕鬆地同時安裝多個版本的庫,並且與特定版本鏈接的應用程序將使用該版本(因爲鏈接器解析了符號文件系統鏈接)。