2013-06-19 30 views
3

我在想:當我產生與Visual Studio(C++),它產生動態鏈接庫的工作原理

  • .dll文件
  • 一的.lib文件

而一個DLL我有一個.h文件

那麼,爲什麼不直接開發一個靜態.lib庫?
例如,爲什麼Office沒有.lib文件?

而且,在將來,如果我更改了DLL,是否還必須向所有機器發送新的.lib文件和.h文件?

+1

這是一個很大的問題。希望你得到一個適當的答案。 – Nawaz

+0

你應該得到動態鏈接和靜態鏈接之間的區別... –

+0

是的我知道不同之處,但是如果我必須始終攜帶.lib文件,爲什麼不直接生成靜態.lib文件? – LppEdd

回答

4

.h和.lib僅適用於開發人員。 誰寫了程序使用DL​​L。

那些只執行應用程序只需要.DLL。

因此,如果您發佈一個新版本,您將DLL發送給用戶,並將三元組發送給開發人員。除非您更改了公共接口(導出),否則舊客戶端將很樂意使用更新後的DLL,而無需任何工作。

如果您改爲創建靜態.lib,則每個客戶端都必須重建其二進制文件。

3

.lib文件和頭文件是動態庫的靜態部分。
您需要.lib和頭文件才能編譯和鏈接程序,以便它使用您的庫。

那麼爲什麼不使用靜態庫呢?
有多種原因。一種情況是如果你使用一個靜態庫,你的庫的每一次改變都會導致你的程序重新編譯。另一個是你的程序的大小會增加。還有一些。

因此,對於你的第二個問題,lib文件對你的程序的用戶是沒有用的。在辦公室的情況下。只要你沒有源代碼和編譯器,lib文件不會有幫助。

對於你的最後一個問題。答案也很簡單。不,您不需要分發.lib文件。只要界面保持不變,您就可以用新版本替換dll文件。

+0

這就是我真正喜歡的答案,非常感謝mkaes和@ balog-pal – LppEdd

2

這是一個簡短的版本,試圖回答您的具體問題。 「DLL和共享庫如何工作」這個主題有相當長的篇幅,我只是不打算把它寫成答案。

編譯器生成的一個.lib和一個.dll文件的開頭部分的使用方式如下:.lib文件包含使用.dll進入.exe文件的「存根」,幷包含「where找到.dll文件中的不同功能「。所以這隻在構建.exe文件時使用。同樣,.h文件在編譯.dll和.exe文件時使用,並且在組成產品的最終二進制文件(.exe和.dll文件)沒有使用時使用.h文件。

當有多個可執行文件使用相同的.dll文件時,使用DLL的靜態鏈接的目的是最重要的。如果只有一個DLL的「用戶」,那麼好處就會減少,但仍然有一些好處(例如區隔,能夠僅對部分代碼提供更新,插件等)。

假設你的.dll是一個只包含二進制文件,沒有源代碼的程序的一部分,那麼你只需要分發新的.dll文件[只要這些函數沒有以這樣的方式改變.exe或其他使用此.dll的.dll必須更改,當然]。

+0

謝謝,真的很有意思! – LppEdd