C++ 动态链接库的工作原理

C++ 动态链接库的工作原理,c++,dll,static-libraries,C++,Dll,Static Libraries,我在想:当我用visualstudio(C++)生成DLL时,它会生成 一个.dll文件 一个.lib文件 我有一个.h文件 那么,为什么不直接开发一个静态的.lib库呢? 例如,为什么Office没有.lib文件 而且,在将来,如果我更改DLL,我是否还必须向所有机器发送新的.lib文件和.h文件?该.h和.lib文件只供开发人员使用。编写程序以使用DLL的人 那些只执行应用程序的人只需要.DLL 因此,如果发布新版本,则向用户发送DLL,并向开发人员发送三元组。除非您更改了公共接口(导出

我在想:当我用visualstudio(C++)生成DLL时,它会生成

  • 一个.dll文件
  • 一个.lib文件
我有一个.h文件

那么,为什么不直接开发一个静态的.lib库呢?
例如,为什么Office没有.lib文件


而且,在将来,如果我更改DLL,我是否还必须向所有机器发送新的.lib文件和.h文件?

该.h和.lib文件只供开发人员使用。编写程序以使用DLL的人

那些只执行应用程序的人只需要.DLL

因此,如果发布新版本,则向用户发送DLL,并向开发人员发送三元组。除非您更改了公共接口(导出),否则旧客户端将乐于使用更新后的DLL,而无需进行任何工作


如果您改为构建一个static.lib,那么每个客户机都必须重建其二进制文件

.lib文件和头文件是动态库的静态部分。
您需要.lib和头文件来编译和链接程序,以便它使用您的库

那么为什么不使用静态库呢?
原因是多方面的。一种可能是,如果使用静态库,库的每次更改都会导致程序重新编译。另一个问题是,您的程序的大小将增加。还有一些

所以对于第二个问题,lib文件对于程序的用户来说是无用的。在办公室里。只要没有源代码和编译器,lib文件就不会有帮助


最后一个问题。答案也很简单。不,您不需要分发.lib文件。只要接口保持不变,您就可以用新版本替换dll文件。

这是一个简短的版本,试图回答您的特定问题。“DLL和共享库是如何工作的”这一主题有相当长的几页,我不打算把它全部写下来作为答案

从编译器生成的部分开始,.lib和.dll文件按如下方式使用:.lib文件包含使用.dll进入.exe文件的“存根”,并在.dll文件中包含“查找不同函数的位置”。因此,这仅在生成.exe文件时使用。类似地,.h文件在编译.dll和.exe文件时使用,并且在拥有构成产品的最终二进制文件(.exe和.dll文件)后不再使用

当有多个可执行文件使用相同的.DLL文件时,使用DLL的超静态链接的目的最为重要。如果一个DLL只有一个“用户”,那么好处就减少了,但仍然有一些好处(例如划分、只向代码的那一部分提供更新的能力、插件等)


假设您的.dll是只包含二进制文件而不包含源代码的程序的一部分,那么您只需要分发新的.dll[当然,只要函数没有以使用此.dll的.exe或其他.dll必须更改的方式更改]

这是一个大问题。希望你能得到一个正确的答案。你应该知道动态链接和静态链接之间的区别……是的,我知道区别,但是如果我必须始终携带.lib文件,为什么不直接生成一个静态.lib文件呢?这是我非常喜欢的答案,非常感谢mkaes和@balog palThank,非常有趣!