【问题标题】:Why do some DLL files need an additional .lib file for linking?为什么有些 DLL 文件需要额外的 .lib 文件来链接?
【发布时间】:2013-12-11 12:57:20
【问题描述】:

我有一个关于库链接和 .lib 文件的问题...

这是上下文:

  • 操作系统 = Windows
  • IDE = QT

我创建了一个 DLL:MyLib.dll。
要在我的 QT 项目中使用该库,我只需要包含一个包含路径、一个库链接并使用头文件:

LIBS += "C:\myPath\MyLib.dll"
INCLUDEPATH += "C:\myPath"
HEADERS += \
    ../myPath/MyLib_global.h \
    ../myPath/mylib.h

我在我的项目中使用第三方 dll:third.dll
如果我按照上面的例子做同样的事情,它就不起作用:

LIBS += "C:\myPath\third.dll" 

第三方 DLL 附带一个 .lib 文件“third.lib”,我显然需要与 DLL 一起使用。

这是为什么呢?为什么有些 DLL 库需要 .lib 文件而其他 DLL 库不需要?
难道.lib是访问DLL的静态库?

非常感谢!

【问题讨论】:

    标签: qt dll shared-libraries static-libraries dynamic-linking


    【解决方案1】:

    我的回答可能并不针对具体情况,但对于大多数提出相同问题的开发人员来说会很有用。安东尼·威廉姆斯回答了这个问题

    What is inside .lib file of Static library, Statically linked dynamic library and dynamically linked dynamic library?

    您不需要 .lib 文件来使用动态库,但没有 您不能将 DLL 中的函数视为您的正常函数 代码。相反,您必须手动调用 LoadLibrary 来加载 DLL(和 FreeLibrary 完成后),并 GetProcAddress 获取 DLL 中函数或数据项的地址。然后你必须施放 返回的地址指向一个适当的函数指针,以便 使用它。

    【讨论】:

      【解决方案2】:

      lib 文件是一个导入库文件,它允许最终的可执行文件包含一个导入地址表 (IAT),通过该表引用所有 DLL 函数调用。基本上,允许查找函数。

      你可以阅读它here

      要让 Qt 生成库,请将其添加到 .pro:-

      CONFIG+= staticlib
      

      Here's 一些关于如何创建库的文档。

      【讨论】:

      • 感谢@Merlin069 的回答。这澄清了它!一件事:当我创建 myLib.dll 时,我没有看到任何使用 DLL 文件生成 lib 文件的方法。构建DLL时是否可以选择?此外,我的 DLL 中的所有函数调用似乎也可以在没有 lib 文件的情况下访问。这不是 .lib 文件应该允许的吗?谢谢
      • 默认应该有导入库。
      • 你的 IDE 中可能有一个设置来创建 lib 文件,如果它还没有生成的话。据我了解,没有lib文件,你可以单独加载dll并调用函数,但是如果你想用静态库构建可执行文件,则需要lib。
      • 我已经更新了Qt中如何生成和使用lib的答案。
      • 感谢@Merlin069 该链接非常有用。根据文章,lib或非lib的整个业务取决于使用的编译器。如果库是使用 MSCV2010 编译的,您将需要 .lib 文件。但如果库是使用 MinGW 编译的,则根本没有 .lib。就我而言,这解释了为什么一个库有 .lib 而另一个库没有;我们使用了不同的编译器。
      【解决方案3】:

      这是为什么呢?为什么有些 DLL 库需要 .lib 文件,而其他 DLL 库不需要?

      链接 dll 有两种类型: 加载时动态链接 [ 隐式 ] 运行时动态链接 [显式]

      如果您使用 dll 的运行时动态链接,则不使用 .lib 但是,对于 dll 的加载时动态链接,使用了.lib 文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        • 2011-10-20
        • 1970-01-01
        • 2016-05-26
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        相关资源
        最近更新 更多