我在想:當我產生與Visual Studio(C++),它產生動態鏈接庫的工作原理
- .dll文件
- 一的.lib文件
而一個DLL我有一個.h文件
那麼,爲什麼不直接開發一個靜態.lib庫?
例如,爲什麼Office沒有.lib文件?
而且,在將來,如果我更改了DLL,是否還必須向所有機器發送新的.lib文件和.h文件?
我在想:當我產生與Visual Studio(C++),它產生動態鏈接庫的工作原理
而一個DLL我有一個.h文件
那麼,爲什麼不直接開發一個靜態.lib庫?
例如,爲什麼Office沒有.lib文件?
而且,在將來,如果我更改了DLL,是否還必須向所有機器發送新的.lib文件和.h文件?
.h和.lib僅適用於開發人員。 誰寫了程序使用DLL。
那些只執行應用程序只需要.DLL。
因此,如果您發佈一個新版本,您將DLL發送給用戶,並將三元組發送給開發人員。除非您更改了公共接口(導出),否則舊客戶端將很樂意使用更新後的DLL,而無需任何工作。
如果您改爲創建靜態.lib,則每個客戶端都必須重建其二進制文件。
.lib文件和頭文件是動態庫的靜態部分。
您需要.lib和頭文件才能編譯和鏈接程序,以便它使用您的庫。
那麼爲什麼不使用靜態庫呢?
有多種原因。一種情況是如果你使用一個靜態庫,你的庫的每一次改變都會導致你的程序重新編譯。另一個是你的程序的大小會增加。還有一些。
因此,對於你的第二個問題,lib文件對你的程序的用戶是沒有用的。在辦公室的情況下。只要你沒有源代碼和編譯器,lib文件不會有幫助。
對於你的最後一個問題。答案也很簡單。不,您不需要分發.lib文件。只要界面保持不變,您就可以用新版本替換dll文件。
這就是我真正喜歡的答案,非常感謝mkaes和@ balog-pal – LppEdd
這是一個簡短的版本,試圖回答您的具體問題。 「DLL和共享庫如何工作」這個主題有相當長的篇幅,我只是不打算把它寫成答案。
編譯器生成的一個.lib和一個.dll文件的開頭部分的使用方式如下:.lib文件包含使用.dll進入.exe文件的「存根」,幷包含「where找到.dll文件中的不同功能「。所以這隻在構建.exe文件時使用。同樣,.h文件在編譯.dll和.exe文件時使用,並且在組成產品的最終二進制文件(.exe和.dll文件)沒有使用時使用.h文件。
當有多個可執行文件使用相同的.dll文件時,使用DLL的靜態鏈接的目的是最重要的。如果只有一個DLL的「用戶」,那麼好處就會減少,但仍然有一些好處(例如區隔,能夠僅對部分代碼提供更新,插件等)。
假設你的.dll是一個只包含二進制文件,沒有源代碼的程序的一部分,那麼你只需要分發新的.dll文件[只要這些函數沒有以這樣的方式改變.exe或其他使用此.dll的.dll必須更改,當然]。
謝謝,真的很有意思! – LppEdd
這是一個很大的問題。希望你得到一個適當的答案。 – Nawaz
你應該得到動態鏈接和靜態鏈接之間的區別... –
是的我知道不同之處,但是如果我必須始終攜帶.lib文件,爲什麼不直接生成靜態.lib文件? – LppEdd