windeployqt错过了一些库,并获取其他不需要的

通常要部署一个Qt项目我要么:

  1. 继续运行它,并find它抱怨的库缺失,并添加它们,直到没有更多。
  2. 使用依赖的步行者,让我最大的方式(如果不是全部),然后回到选项1。
  3. 或者只是创build一个静态链接的版本(有时在屁股疼痛)

所以我现在想试试windeployqt,对于我在D:\install\Qt\5.5\mingw492_32\bin\

然后我运行它使用:

D:\>D:\install\Qt\5.5\mingw492_32\bin\windeployqt.exe d:\software\build-qtGuiTestApp-Desktop_Qt_5_5_0_MinGW_32bit-Debug\debug

这里是结果输出:

 D:\software\build-qtGuiTestApp-Desktop_Qt_5_5_0_MinGW_32bit-Debug\debug\qtGuiTes 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:\software\build-qtGuiTestApp-Desktop_Qt_5_5_0_MinGW_32bit-Debug\debug \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所以是啊,很多的core, gui, network, webkit, webkitwidgets库。

但是,当我运行我的可执行文件,我得到的错误,它无法find以下库:

  • libgcc_s_dw2-1.dll
  • 的libstdc ++ – 6.dll
  • libwinpthread-1.DLL

我手动添加他们从相同的文件夹( D:\install\Qt\5.5\mingw492_32\bin\ ),它工作正常。 我的问题是:

  1. 为什么会错过这些文件?
  2. 我怎样才能让他们得到他们?
  3. 1GB的库似乎对我来说有点过分,所以我绕了一圈,删除了一些我认为不需要的东西,而且我的可执行文件仍然运行正常。 那么如何才能使windeployqt更高效,并获得所需的DLL呢?

没有这些问题的答案,我发现这个工具对我来说有点无用,因为我可以做得更好自己….我可能会脚本的东西来继续运行它,并阅读错误,并复制相关的DLL:o

编辑

下面的文件夹(与dll的)添加,但它们只有75mb …公平近1GB是由于我使用的webkit,quick,gui和其他大Qt库:

 mediaservice, platforms, playlistformats, position, printsupport, sensorgestures, sensors, sqldrivers, translations, audio, iconengines, imageformats 

  1. 为什么会错过这些文件?

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

  1. 我怎样才能让他们得到他们?

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

  1. 1GB的库似乎对我来说有点过分,所以我绕了一圈,删除了一些我认为不需要的东西,而且我的可执行文件仍然运行正常。 那么如何才能使windeployqt更高效,并获得所需的DLL呢?

我认为你是依赖于你的项目中的模块太多,所以包括所有的dll文件将不得不是很大,不知道你排除的dll文件,以及如果没有它们的程序运行良好。 也许你可以命名一些不需要的dll文件。 当然,只要你不打破许可证,你总是可以选择静态构建(这将导致更小和更干净的部署大小)。

@Mike已经给你关于windeployqt的问题提供了全面的答案。 我想谈谈一些不属于你的核心问题的部分,但仍然非常重要:

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

你的DLL太大的主要原因是你创建了一个Debug版本。 调试应用程序/ DLL包含大量额外的代码和信息,可以帮助您调试您的应用程序。 例如,如果你的程序崩溃,你的调试器可以打印出有关崩溃发生的位置以及导致崩溃的步骤的有用信息。 但是,这个额外的代码和信息占用了大量的空间。 您不应该将Debug版本分发给您的用户。

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

最后的结果:看看你的应用程序链接到的Qt DLL。 如果它们的前缀是“d”(例如Qt5Cored.dllQt5Guid.dll ),则表示它们是Debug版本。 发行版本没有“d”前缀(例如Qt5Core.dllQt5Gui.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
  • Qt5Gui.dll
  • Qt5Widgets.dll
  • 平台/ qwindows.dll
  • YourApp.exe

它来到约20 MB(8 MB压缩)。