正规的DLL使用:MFC共享库与MFC静态链接

9
当我们使用Visual Studio(VC8或9)创建DLL时,我们会得到一个选项:创建常规DLL。
 using MFC as shared DLL

或者

 using MFC as static library

他们有什么不同?哪一个更值得使用?
3个回答

15

静态库是指你从库中使用的代码被包含在可执行文件中。由于这个原因,你不需要将库发送给用户或要求用户在他们的机器上安装库。但是这会增加可执行文件的大小并将你与该库版本绑定在一起,因此如果你只需要更新库,则必须发送一个新的可执行文件。

动态库在需要时(运行时)调用库来执行代码,但它需要用户已经安装它(通常是特定或最低版本)。如果需要,您还可以将所需版本的库与应用程序一起分发。

至于哪个更好,我不知道。我不是Windows C++或MFC程序员,所以我不能说。在我的Linux服务器上,我编写的应用程序通常是服务器端的,因此使用共享库。

这取决于您的应用程序如何使用、分发、更新、MFC库的更改频率,以及它是否普遍可用于用户的PC等因素。


7

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

如果您使用MFC DLL作为动态链接,那么您的代码将需要Microsoft Foundation Library DLL(特别是您的代码所需的版本)与您的应用程序或dll一起安装在用户端。这意味着您的安装包将包含以下内容:

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

这使得安装包大小变得更大,同时让用户下载您的安装设置需要更长的时间。

如果您链接到MFC作为静态库,即使用户端没有MFC DLLs,您的代码也能正常工作。原因很简单,您在代码中引用的所有MFC库都将链接到您的应用程序或dll中。这意味着在您的应用程序/ dll中使用的那些MFC库将成为您二进制代码的一部分;然而,您的应用程序/ dll会稍微变大。


1
尽管安迪的答案在区分静态库和共享库方面是正确的,但由于这个问题涉及到询问“将MFC用作静态库还是共享库”的区别,因此选择这个答案是正确的。 - Akaanthan Ccoder
这个回答仍然没有解释为什么微软觉得有必要为一个看起来只是一个普通库的组件单独设计一个下拉框。这是否为了方便IDE的GUI设计师?如果还有人知道的话,微软应该回答这个问题。 - undefined

4
另一个需要考虑的问题是应用程序的维护。
如果您使用 MSFT redis 并动态链接其库,那么如果 MSFT 后来在 DLL 中“修复”了某些重要缺陷,他们会通过 Windows 更新在客户机上修补 DLL。如果您静态链接,则需要直接更新所有客户端。
当然,如果您担心修补后的 DLL 可能会破坏您的应用程序(因为您依赖于未指定的行为),则您可能希望直接与客户端处理维护(和测试)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接