【问题标题】:Why Qt Creator can link dll correctly without .lib and LoadLibrary()?为什么 Qt Creator 可以在没有 .lib 和 LoadLibrary() 的情况下正确链接 dll?
【发布时间】:2019-10-01 01:40:39
【问题描述】:

通常当我们链接到一个 dll 时,我们也必须使用 .lib 以便链接器可以判断它是动态链接。 但是在 Qt Creator 中,我们可以在没有它的情况下做到这一点。

我按照youtube上的说明,简单的流程如下:

  1. 准备了一个TestMessagePack.dll,由GCC编译;
  2. 将dll复制到exe所在的debug文件夹中。
  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文件,链接器怎么知道呢?

我要知道里面的原理

【问题讨论】:

  • 第 2 步不是必需的。所需要的只是告诉链接器这些函数存在于某处,然后您通过指定 lib 文件来做到这一点。您遵循的步骤给出了在构建过程中使用 DLL 的错误想法(可能是无意的),但事实并非如此。也许 Qt 系统会尝试从您给它的 dll 名称中找到“lib”文件,但绝不需要实际的 DLL 文件来构建应用程序。要运行您的应用程序,那么DLL就变得很重要了。

标签: c++ qt dll compilation linker


【解决方案1】:

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

直接链接到 dll

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

...

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

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

...

这种行为是由 MingGW 给出的??您正在使用的链接器。这意味着动态库与ld 的链接可以在 Windows 上以与类 unix 操作系统相同的方式完成,其中不存在导入库。 Qt 不相关。

【讨论】:

    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 2019-08-26
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多