4

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

  • .dll 文件
  • .lib 文件

我有一个 .h 文件

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

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

4

3 回答 3

4

.h 和 .lib 仅供开发人员使用。编写程序来使用 DLL 的人。

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

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

如果您改为构建静态 .lib,则每个客户端都必须重新构建其二进制文件。

于 2013-06-19T12:05:37.850 回答
3

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

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

因此,对于您的第二个问题,lib 文件对您的程序用户来说毫无用处。在办公室的情况下。只要您没有源代码和编译器,lib 文件就无济于事。

对于你的最后一个问题。答案也很简单。不,您不需要分发 .lib 文件。只要界面保持不变,您就可以将dll文件替换为新版本。

于 2013-06-19T12:06:22.137 回答
2

这是一个简短的版本,试图回答您的具体问题。“DLL 和共享库是如何工作的”这个主题有好几页,我只是不打算写这些作为答案。

从编译器生成的部分开始,.lib 和 .dll 文件的使用如下:.lib 文件包含使用 .dll 进入 .exe 文件的“存根”,并包含“在哪里可以找到不同的函数”在 .dll 文件中。所以这仅在构建 .exe 文件时使用。同样,在编译 .dll 和 .exe 文件时会使用 .h 文件,一旦您拥有构成产品的最终二进制文件(.exe 和 .dll 文件),就不会使用该文件。

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

假设您的 .dll 是仅包含二进制文件、不包含源代码的程序的一部分,那么您只需分发新的 .dll [只要功能没有以 .exe 或其他 .dll 的方式发生变化当然,使用这个 .dll 的人必须改变]。

于 2013-06-19T12:08:49.870 回答