在我的lib目錄中,我看到大多數共享對象鏈接是級聯的。例如:C++爲什麼級聯共享對象鏈接
libctest.so.1.0 -> libctest.so.1
libctest.so.1 -> libctest.so
我知道libctest.so
鏈接是使編譯標誌-lctest
工作,但什麼是有libctest.so.1
的地步?
在我的lib目錄中,我看到大多數共享對象鏈接是級聯的。例如:C++爲什麼級聯共享對象鏈接
libctest.so.1.0 -> libctest.so.1
libctest.so.1 -> libctest.so
我知道libctest.so
鏈接是使編譯標誌-lctest
工作,但什麼是有libctest.so.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需要不同版本庫庫的幾個不兼容的版本。
這些數字都是關於版本控制的。這意味着您可以輕鬆地同時安裝多個版本的庫,並且與特定版本鏈接的應用程序將使用該版本(因爲鏈接器解析了符號文件系統鏈接)。
如果實際'so'文件的名稱是'libctest.so.199',我只需要創建一個鏈接'libctest.so - > libctest.so.199',對不對? – user4016367