2010-04-16 63 views
4

當我們使用Visual Studio創建一個DLL(VC8或9),我們得到了一個選項, 創建常規DLL常規DLL:MFC共享VS MFC靜態鏈接

using MFC as shared DLL 

using MFC as static library 

他們有什麼不同?哪一個建議使用?

回答

4

[我想我得到了我現在答案]

如果您使用MFC DLL作爲動態鏈接,您的代碼將需要與您的應用程序或用戶端一起安裝的Microsoft Foundation Library DLL(特別是您的代碼所需的版本)。因此,這意味着你的安裝包將包含

  • 您的應用程序/ DLL和支持文件
  • 所有MFC的Dll

這使得安裝包大小去更大,也使需要時間用戶下載您的安裝設置。

如果以靜態庫的形式鏈接到MFC,即使沒有MFC DLL出現在用戶端,您的代碼也可以正常工作。原因很簡單,你在代碼中引用的所有MFC庫都將鏈接到你的應用程序或DLL中。這意味着你的app/dll中使用的MFC庫成爲你的二進制文件的一部分;但是,您的應用/ dll會稍大一點。

+1

儘管Andy的答案對於區分靜態庫和共享庫是正確的,但由於此問題涉及到要求將「使用MFC作爲靜態庫還是共享庫」進行區分,因此選擇此答案是正確的。 – AKN 2010-04-20 05:17:59

11

靜態庫表示從庫中使用的代碼包含在可執行文件中。因此,您無需運送庫或要求最終用戶在機器上安裝它。然而,這會膨脹你的可執行文件的大小並將你綁定到該庫版本,所以如果你只需要更新庫,你必須提供一個新的可執行文件。

共享庫在需要時(運行時)執行代碼時調用庫,但它需要用戶在其機器上安裝它(通常是特定或最低版本)。如果需要,還可以在應用程序中分發所需的庫版本。

至於哪個更好,我不知道。我不是Windows C++或MFC程序員,所以我不能說。在我的Linux服務器上,我編寫的應用程序通常是服務器端的,因此使用共享庫。

這取決於你的應用程序是如何被使用的,分佈式的,更新的頻率MFC庫的變化,如果是一般可在用戶的個人電腦等

2

另一個考慮是爲您的應用程序提供服務。

如果您發佈MSFT redis,動態鏈接到它的庫,然後MSFT稍後「修復」DLL中的一些重要缺陷,它們會通過Window更新將DLL修補到客戶機器上。如果您靜態鏈接,則需要直接更新所有客戶。當然,如果你擔心補丁DLL可能會破壞你的應用程序(因爲你依賴未指定的行爲),你可能想要直接與你的客戶進行服務(和測試)。