我遇到的 DLL Hell

2021-05-27 08:53:42 字數 772 閱讀 5501

dll hell 資料:

dll hell字面意思是dll"災難",是由於com元件公升級引起的程式不能執行的情況。com物件常常被編譯為dll檔案。com元件模型雖然很不錯,但是它自身存在致命的缺陷。由於com物件可以被重用,這樣多個程式可能使用乙個com物件 ,如果這個com元件公升級了,就很有可能出現其中某個程式無法使用新元件,導致程式不能執行的情況,這種情況被稱為「dll hell」。有時安裝了新的軟體後很多其他的軟體都無法使用,往往就是這個原因。windows系統是以dynamic link library(動態鏈結庫)的方式讓系統和應用軟體共用所有的系統檔案的。dll hell的意思就是因為系統檔案被覆蓋而讓整個系統像是掉進了地獄(什麼軟體都不能執行了)。

可能的原因

很多windows的應用程式在發布的時候會將它們所有要用到的dll都一起打包發布,很多應用程式的安裝程式都不是很成熟,經常在安裝的時候將乙個舊版本的dll覆蓋掉乙個更新版本的dll,從而導致其他的應用程式執行失敗。有些安裝程式比較友好,如果碰到需要覆蓋新版的dll時,它會彈出乙個對話方塊提醒使用者是否覆蓋,但是即使這樣,有些應用程式只能執行在舊版本的dll下,如果不覆蓋,那麼它可能無法在新版的dll中執行。總的來說,有三種可能的原因導致了dll hell的發生:

一是由使用舊版本的dll替代原來乙個新版本的dll而引起的。這個原因最普遍,是windows 9x使用者通常遇到的dll錯誤之一。

二是由新版dll中的函式無意發生改變而引起。儘管在設計dll時候應該向下相容,然而要保證dll完全向下相容卻是不能的。

三是由新版dll的安裝引入乙個新的bug。

linux處理dll hell的機制

1.共享庫命名以libmath.so.1.2.3,其中1是主版本號,2是小版本號,3是build號.主版本號的修改意味著介面的變化,小版本號和build號的變化意味著bug fix 這個名字稱為動態庫的real name 2.libmath.so.1這個名字,這個成為動態庫的soname,共享庫bu...

解決DLL Hell的方式 Dll匯出類

禁止外部繼承匯出類和直接生成類的例項,通過dll記憶體生成類的例項 1.通過類的靜態成員函式匯出類的例項 定義乙個靜態成員函式用來生成類的例項,上 pragma once include ifdef transimg api define transimg declspec dllexport el...

我遇到的socket tcp ip問題

1.坑爹,居然由於客戶端太快,導致 客戶1的鏈結剛剛到 1處,客戶2的鏈結就立馬到了 1處,吧客戶1的connfd給覆蓋掉了。到處出現2個同樣的執行緒。尼瑪 int connfd accept server socket,struct sockaddr client addr,length 1 if...