【问题标题】:How Dynamic-link library works动态链接库的工作原理
【发布时间】:2013-06-19 11:55:46
【问题描述】:

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

  • .dll 文件
  • .lib 文件

我有一个 .h 文件

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

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

【问题讨论】:

  • 这是个大问题。希望你能得到正确的答案。
  • 你应该明白动态链接和静态链接的区别...
  • 是的,我知道区别,但是如果我必须始终携带 .lib 文件,为什么不直接生成静态 .lib 文件呢?

标签: c++ dll static-libraries


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这是我非常喜欢的答案,非常感谢 mkaes 和 @balog-pal
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 谢谢你,真的很有趣!
    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 2013-11-17
    • 2011-11-11
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    相关资源
    最近更新 更多