为什么有些DLL文件需要额外的.lib文件才能进行链接?

时间:2013-11-26 11:41:48

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

我对库链接和.lib文件有疑问......

这是背景:

  • OS = 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的静态库?

非常感谢!

3 个答案:

答案 0 :(得分:7)

我的回答可能不是特定于上下文,但对于大多数提出相同问题的开发人员都很有用。这是由安东尼威廉姆斯回答的。

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

  

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

答案 1 :(得分:6)

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

您可以阅读here

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

CONFIG+= staticlib

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

答案 2 :(得分:0)

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

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

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