【问题标题】:why there is a .lib file when create dynamic .dll file?为什么创建动态 .dll 文件时会有一个 .lib 文件?
【发布时间】:2021-12-20 16:45:43
【问题描述】:

我尝试使用visual studio在windows上构建一个动态dll库,但是生成了两个文件,一个是dll文件,另一个是.lib文件;

我使用 dll 库的知识是把它提供给链接器,我不知道 .lib 文件的用途是什么,它与静态库具有相同的文件扩展名,它绝对不是静态库;

在所有情况下创建动态 dll 库时,Visual Studio 是否会生成 .lib 文件?

我需要在我的应用程序中使用 .lib 文件吗?

如何在我的应用程序中使用 .lib 文件?

【问题讨论】:

  • msvc 中,在构建dll 期间创建的.lib 文件是导入库而不是静态库。您链接到导入库并在运行时使用 dll。您不使用 dll 链接。
  • 该库用于构建时的链接(静态链接)——它包含动态链接器稍后将使用的钩子。另一个在程序加载运行时使用(动态链接)。
  • 我使用 dll 库的知识是将其提供给链接器 对于标准/非托管 c++(不使用 .net/cli)和 msvc,这是错误的。使用 msvc 时,您不会链接到本机 c++ 中的 dll。您链接到 dll 的导入库。
  • @JaMiT 第二个问题回答了我的问题。由于 jwezorek 也做出了很好的回答,我接受了他的回答

标签: c++ dll


【解决方案1】:

这与"implicit" linking and "explicit" linking 的区别有关。一句话回答你的问题是 .lib 文件,通常称为“存根库”并正式称为“导入库”,当你执行隐式链接时是必需的,但不是其他的。

在隐式链接中,编译器在编译时为调用 DLL 生成外部函数引用,然后链接器需要将它们链接到某些东西:它使用导入库来帮助它做到这一点。链接器将这些调用视为特殊情况;它在可执行文件中插入代码以查找 DLL 并为特定功能调用 DLL。

从程序员的角度来看,隐式链接的行为类似于静态链接除了 DLL 需要在应用程序运行时系统可以找到它的地方,否则系统将弹出在应用程序启动时弹出一个错误对话框。

显式链接意味着查找和加载 DLL 并了解 DLL 中的函数以及如何调用它们是程序员的责任。有关详细信息,请参阅 LoadLibraryGetProcAddress。如果库的使用是有条件的,或者对于具有插件架构的应用程序,其中要使用的实际 DLL 在编译时甚至可能不知道,则显式链接很有用。

一般来说,如果隐式链接可以满足您的需要,那么这样做会更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多