【问题标题】:QT Executable under windowswindows下QT可执行文件
【发布时间】:2020-11-27 22:07:59
【问题描述】:

我正在静态链接一个 QT 应用程序,但由于某种原因,当我打开可执行文件时,我收到了缺少 dll 的错误。

基本上我正在链接以下库:

### LINKER FLAGS ###
LDFLAGS = -LC:/Qt/5.15.0/mingw81_32/lib

LDLIBS = -lQt5Widgets -lQt5Gui -lQt5Core

当我静态链接所有内容时,为什么会因为缺少 dll 而出现错误?

编译和链接正确通过,还生成了可执行文件..我不知道为什么它需要 dll。

编辑:

缺少 dll:

libgcc_s_dw2-1.dll,

libstdc++-6.dll,

Qt5Code.dll,

Qt5Widgets.dll

【问题讨论】:

  • 我刚刚意识到一些非常奇怪的事情。实际可执行文件的大小非常小 - 333kb。这怎么可能?我希望所有这些静态库至少有几 MB。
  • 显然,对于 Qt5CoreQt5Widgets 您正在链接动态版本。如果您在 dir 中有静态和动态版本,当遇到-l${LIB} 时,链接器将默认选择动态版本。要覆盖它,请指定库名称 - 例如:libQt5Core.a。对于其他人,将-static-libstdc++ -static-libgcc 标志传递给链接器。
  • 我改成了:LDLIBS = libQt5Widgets.a libQt5Gui.a libQt5Core.a -static-libgcc -static-libstdc++。但是现在找不到libQt5Widgets.a,libQt5Gui.a,libQt5Core。即使它们在 LDFLAGS = -LC:/Qt/5.15.0/mingw81_32/lib 中。
  • 如果通过完整路径指定它们会发生什么?另外我不确定 -LC:/Qt/5.15.0/mingw81_32/lib 是否有效(因为冒号)。
  • 那么你只有动态构建的 Qt 库。

标签: qt dll linker


【解决方案1】:

要详细说明 CristiFati 的回复,您的项目文件中需要这样一行:

QMAKE_LFLAGS += -static-libstdc++ -static-libgcc

虽然我更喜欢:

QMAKE_LFLAGS_RELEASE += -static-libstdc++ -static-libgcc

请注意,如果您想要一个真正独立、自包含的二进制文件,您需要自己构建一个静态 Qt 库。这是一件大事,不幸的是没有像大多数 Qt 领域那样有据可查。

【讨论】:

  • 我正在使用一个makefile。我添加了这些,它不再抱怨它们了。但我仍然无法修复Qt5Code.dll和Qt5Widgets.dll。我将它们作为libxxx.a,但不知何故,它不会静态链接它们。
  • 当然不行。如果他们这样做了,我会自己发布一个答案。这不符合作为答案的条件,因为它不能解决问题,它应该是一个评论。可能,标志吸引“-”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 2012-08-23
  • 1970-01-01
  • 2013-08-22
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多