为什么Qt Creator在没有.lib和LoadLibrary()的情况下可以正确链接dll?

时间:2019-05-14 05:18:34

标签: c++ qt dll compilation linker

通常,当我们链接到dll时,也必须使用.lib,以便链接程序可以知道它是动态链接。 但是,在Qt Creator中,我们可以不用它。

我按照youtube上的说明进行操作,我的过程很简单,如下所示:

  1. 准备了由GCC编译的TestMessagePack.dll;
  2. 将dll复制到exe所在的调试文件夹中。
  3. 添加以下代码,这些代码还指示包含文件所在的位置。
INCLUDEPATH += "C:\Users\***\Desktop\Brand New\CMakeStuff\include\qmsgpack"

LIBS += "C:\Users\***\Desktop\Brand New\CMakeStuff\bin\TestMessagePack.dll"
  1. 构建并运行。

没有步骤2,链接器将失败。 显而易见,Qt Creator可以链接到不带.lib的dll。 但是,如果没有.lib文件,链接器如何知道?

我需要了解其中的原理

1 个答案:

答案 0 :(得分:1)

您正在使用各种MinGW之一? GCC的Windows端口。在Windows上, GCC工具链的链接器(ld)支持DLL的直接链接,这与Microsoft链接器不同 这需要代理.lib导入库。 Documentation

  

直接链接到dll

     

ld的cygwin / mingw端口支持直接链接到dll,包括数据符号,而无需使用任何导入库。

     

...

还有MinGW: Specify the libraries for the linker to use

  

除了* nix系统上常见的常规“ lib.a”约定外,MinGW还支持根据“ .lib”和“ .dll”约定命名的库。

     

...

这种行为是由MingGW提供的?您正在使用的链接器。这意味着动态库与ld的链接可以在Windows上以与不存在导入库的类Unix操作系统相同的方式进行。 Qt不相关。