windeployqt错过了一些库,而获得了其他不需要的库

windeployqt misses some of the libraries and gets others that are not required

本文关键字:获得了 其他 不需要 错过了 windeployqt      更新时间:2023-10-16

通常部署一个Qt项目I:

  1. 继续运行它,找到它抱怨缺少的库,然后添加它们,直到没有更多的库为止
  2. 使用依赖助行器让我走完大部分路(如果不是全部的话),然后返回选项1
  3. 或者只是创建一个静态链接的版本(有时会感到屁股疼痛)

所以我现在想试试windeployqt,它对我来说存在于D:installQt5.5mingw492_32bin

然后我用运行它

D:>D:installQt5.5mingw492_32binwindeployqt.exe d:softwarebuild-qtGuiTestApp-Desktop_Qt_5_5_0_MinGW_32bit-Debugdebug

以下是结果输出:

D:softwarebuild-qtGuiTestApp-Desktop_Qt_5_5_0_MinGW_32bit-DebugdebugqtGuiTes
tApp.exe 32 bit, debug executable
Adding Qt5Svg for qsvgicond.dll
Skipping plugin qmldbg_qtquick2d.dll due to disabled dependencies.
Skipping plugin qmldbg_tcpd.dll due to disabled dependencies.
Direct dependencies: Qt5Core Qt5Network Qt5WebKitWidgets Qt5Widgets
All dependencies   : Qt5Core Qt5Gui Qt5Multimedia Qt5MultimediaWidgets Qt5Networ
k Qt5OpenGL Qt5Positioning Qt5PrintSupport Qt5Qml Qt5Quick Qt5Sensors Qt5Sql Qt5
WebKit Qt5WebKitWidgets Qt5Widgets
To be deployed     : Qt5Core Qt5Gui Qt5Multimedia Qt5MultimediaWidgets Qt5Networ
k Qt5OpenGL Qt5Positioning Qt5PrintSupport Qt5Qml Qt5Quick Qt5Sensors Qt5Sql Qt5
Svg Qt5WebKit Qt5WebKitWidgets Qt5Widgets
Updating Qt5WebChanneld.dll.
Updating icuin54.dll.
Updating icuuc54.dll.
Updating icudt54.dll.
Updating Qt5Cored.dll.
Updating Qt5Guid.dll.
Updating Qt5Multimediad.dll.
Updating Qt5MultimediaWidgetsd.dll.
Updating Qt5Networkd.dll.
Updating Qt5OpenGLd.dll.
Updating Qt5Positioningd.dll.
Updating Qt5PrintSupportd.dll.
Updating Qt5Qmld.dll.
Updating Qt5Quickd.dll.
Updating Qt5Sensorsd.dll.
Updating Qt5Sqld.dll.
Updating Qt5Svgd.dll.
Updating Qt5WebKitd.dll.
Updating Qt5WebKitWidgetsd.dll.
Updating Qt5Widgetsd.dll.
Updating libGLESV2d.dll.
Updating libEGLd.dll.
Updating D3Dcompiler_47.dll.
Creating directory audio.
Updating qtaudio_windowsd.dll.
Creating directory bearer.
Updating qgenericbearerd.dll.
Updating qnativewifibearerd.dll.
Creating directory iconengines.
Updating qsvgicond.dll.
Creating directory imageformats.
Updating qddsd.dll.
Updating qgifd.dll.
Updating qicnsd.dll.
Updating qicod.dll.
Updating qjp2d.dll.
Updating qjpegd.dll.
Updating qmngd.dll.
Updating qsvgd.dll.
Updating qtgad.dll.
Updating qtiffd.dll.
Updating qwbmpd.dll.
Updating qwebpd.dll.
Creating directory mediaservice.
Updating dsengined.dll.
Updating qtmedia_audioengined.dll.
Creating directory platforms.
Updating qwindowsd.dll.
Creating directory playlistformats.
Updating qtmultimedia_m3ud.dll.
Creating directory position.
Updating qtposition_positionpolld.dll.
Creating directory printsupport.
Updating windowsprintersupportd.dll.
Creating directory sensorgestures.
Updating qtsensorgestures_plugind.dll.
Updating qtsensorgestures_shakeplugind.dll.
Creating directory sensors.
Updating qtsensors_genericd.dll.
Creating directory sqldrivers.
Updating qsqlited.dll.
Updating qsqlmysqld.dll.
Updating qsqlodbcd.dll.
Updating qsqlpsqld.dll.
Creating D:softwarebuild-qtGuiTestApp-Desktop_Qt_5_5_0_MinGW_32bit-Debugdebug
translations...
Creating qt_ca.qm...
Creating qt_cs.qm...
Creating qt_de.qm...
Creating qt_fi.qm...
Creating qt_fr.qm...
Creating qt_hu.qm...
Creating qt_it.qm...
Creating qt_ja.qm...
Creating qt_ko.qm...
Creating qt_lv.qm...
Creating qt_ru.qm...
Creating qt_sk.qm...
Creating qt_uk.qm...
D:>

所以看起来不错,因为我的项目虽然很简单,但使用了:core, gui, network, webkit, webkitwidgets,所以是的,有很多qt库。

然而,当我运行我的可执行文件时,我得到了一个错误,它找不到以下libs:

  • libgcc_s_dw2-1.dll
  • libstdc++-6.dll
  • libwinpthread-1.dll

我从同一个文件夹(D:installQt5.5mingw492_32bin)手动添加了它们,效果很好。我的问题是:

  1. 为什么它会错过这些文件
  2. 我怎样才能拿到它们
  3. 1GB的libs对我来说似乎有点太多了,所以我四处查看并删除了一些我认为不需要的,我的可执行文件仍然运行良好。那么,如何提高windeployqt的效率,并获得所需的DLL呢

如果没有回答这些问题,我发现这个工具对我来说有点无用,因为我自己可以做得更好。。。。我可能会编写一些脚本来继续运行它,并读取错误并复制相关的dll:o

编辑

添加了以下文件夹(带有dll),但它们的数量仅为75mb。。。公平地说,近1GB是由于我正在使用的webkit、quick、gui和其他大型Qt-lib:

mediaservice,
platforms,
playlistformats,
position,
printsupport,
sensorgestures,
sensors,
sqldrivers,
translations,
audio,
iconengines,
imageformats
  1. 为什么它会错过这些文件

这些文件与mingw运行库相关,它们不属于Qt,这就是为什么windeployqt默认情况下不添加它们的原因。

  1. 我怎样才能拿到它们

为了使windeployqt将它们添加到部署目录中,请尝试将--compiler-runtime开关添加到命令中。请注意,您应该使用Qt在其开始菜单快捷方式中提供的命令提示符,而不是自己查找windeployqt路径。

  1. 1GB的libs对我来说似乎有点太多了,所以我四处查看并删除了一些我认为不需要的,我的可执行文件仍然运行良好。那么,如何提高windeployqt的效率,并获得所需的DLL呢

我认为你的项目中依赖的模块太多了,所以包括它们的所有dll文件都必须很大,但不确定你排除的dll文件,以及没有它们你的程序如何运行。也许你可以命名一些不需要的dll文件。当然,只要你不违反许可证,你总是可以选择静态构建(这将导致更小、更干净的部署规模)。

  • libgcc_s_dw2-1.dll
  • libstdc++-6.dll
  • libwinpthread-1.dll

如果指定了--compiler-runtime标志,则应复制这些文件,但只有当路径中有g++.exe时,它才有效。

此外,我发现Qt对在Windows上包含哪些文件过于谨慎。对于QtWidgets应用程序,您至少需要:

  • libgcc_s_dw2-1.dll
  • libstdc++-6.dll
  • libwinpthread-1.dll
  • Qt5Core.dll
  • Qt5Guid.dll
  • Qt5Widgets.dll
  • platforms/qwindows.dll
  • YourApp.exe

它大约有20 MB(8 MB压缩)。

@Mike已经对您关于windeployqt的问题给出了全面的答案。我想解决一些不是你核心问题的一部分,但仍然非常重要的问题:

  1. 1GB的libs对我来说似乎有点过分

DLL如此之大的主要原因是因为您创建了调试生成。调试应用程序/DLL包含许多额外的代码和信息,可以帮助您调试应用程序。例如,如果程序崩溃,调试器可以打印出有关崩溃发生的位置以及导致崩溃的步骤的有用信息。然而,这些额外的代码和信息占用了大量空间。不应将调试生成分发给用户。

如果你创建了一个Release版本,你的编译器会省去所有额外的调试代码和信息,这会大大缩小你的DLL。编译器还将执行各种优化,使您的应用程序运行得更快。始终创建一个Release内部版本供其他人下载。

最后的花絮:看看你的应用程序链接到的Qt DLL。如果它们的名称以"d"结尾(例如Qt5Cored.dllQt5Guid.dll),那就意味着它们是调试版本。Release版本没有'd'后缀(例如Qt5Core.dllQt5Gui.dll

根据您使用的工具包从qt的命令提示符运行windeployqt.exe。否"--编译器运行时标志";必需。