1. 共享庫命名以libmath.so.1.2.3, 其中1是主版本號, 2是小版本號,3是build號. 主版本號的修改意味著介面的變化, 小版本號和build號的變化意味著bug fix
這個名字稱為動態庫的real name
2. libmath.so.1這個名字,這個成為動態庫的soname, 共享庫build時會把soname寫入共享庫檔案頭內
3. 應用程式link時階段,通過libmath.so(稱為link name), 從系統中查詢動態庫, 把動態庫檔案頭內的soname讀出,儲存在自己的檔案頭中
以後程式執行時就會利用其檔案頭中的soname去系統中搜尋共享庫
4. 系統中利用ln命令在soname和real name之間建立關聯, 達到支援以soname搜尋動態庫的目的
ln -s libmath.so.1.2.3 libmath.so.1
最後,這只是乙個推薦機制, 而不是強制機制
在上述機制的背後有乙個程式:ldconfig
ldconfig會去搜尋/lilb和/usr/lib,以/etc/ld.so.conf內所列的目錄下的庫檔案。
搜尋出可共享的動態鏈結庫,庫檔案的格式為:lib***.so.**(so後一定是三個數字?),進而建立出動態裝入程式(ld.so)所需的連線和快取檔案。
快取檔案預設為/etc/ld.so.cache,該檔案儲存已排好序的動態鏈結庫名字列表。
ldconfig通常在系統啟動時執行,而當使用者往/lib和/usr/lib裡面加東西,是不用修改/etc/ld.so.conf檔案的,但是新增完後需要呼叫下ldconfig, 如果安裝在了其他目錄下,則需要修改/etc/ld.so.conf檔案內容, 然後手動執行ldconfig
簡而言之:linux通過兩個鏈結檔案解決dll hell問題
我遇到的 DLL Hell
dll hell 資料 dll hell字面意思是dll 災難 是由於com元件公升級引起的程式不能執行的情況。com物件常常被編譯為dll檔案。com元件模型雖然很不錯,但是它自身存在致命的缺陷。由於com物件可以被重用,這樣多個程式可能使用乙個com物件 如果這個com元件公升級了,就很有可能出...
解決DLL Hell的方式 Dll匯出類
禁止外部繼承匯出類和直接生成類的例項,通過dll記憶體生成類的例項 1.通過類的靜態成員函式匯出類的例項 定義乙個靜態成員函式用來生成類的例項,上 pragma once include ifdef transimg api define transimg declspec dllexport el...
DLL Hell的產生和如何有效的避免
在使用dll 匯出類指標時容易出現 dll hell,指標物件的虛函式的定址方式為編譯時確定的,所以直接呼叫指標物件的虛函式是非安全的。弊端 當需求增加或修改時可能原有某功能函式無法滿足需求,導致修改了原有函式的引數個數,引數型別,引數順序和返回值型別後導致新舊版本相容失敗 當然也可以新增加乙個函式...