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

时间:2016-04-14 18:11:42

标签: c++ windows qt dll deployment

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

  1. 继续运行它并找到它所抱怨的库缺失并添加它们,直到不再存在。
  2. 使用依赖性walker让我大部分时间(如果不是全部),然后返回选项1.
  3. 或者只是创建一个静态链接的版本(有时候会有痛苦)
  4. 所以我现在想尝试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所以是的,很多qt库。

    然而,当我运行我的可执行文件时,我收到错误,它无法找到以下库:

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

    我从同一个文件夹(D:\install\Qt\5.5\mingw492_32\bin\)手动添加它们,它运行正常。我的问题是:

    1. 为什么会错过这些文件?
    2. 我怎样才能让它们得到它们?
    3. 1GB的lib对我来说似乎有些过分,所以我四处走动并删除了一些我认为不需要的东西,而且我的可执行文件仍然正常运行。那么如何才能让windeployqt更有效率并获得所需的DLL呢?
    4. 如果没有回答这些问题,我发现这个工具对我来说有点无用,因为我自己可以做得更好....我可能会编写一些东西来继续运行它并读取错误并复制相关的dll:o

      修改

      添加了以下文件夹(带有dll' s),但它们只有75mb ...公平地说,近1GB是由于我使用的webkit,quick,gui和其他大型Qt库:

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

4 个答案:

答案 0 :(得分:4)

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

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

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

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

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

我认为你依赖于项目中的太多模块,所以包括他们所有的dll文件都必须很大,但不确定你排除的dll文件以及没有它们你的程序如何正常运行。也许你可以命名一些不需要的DLL文件。当然,只要您不打破许可证,您就可以选择静态构建(这将使部署规模更小,更清晰)。

答案 1 :(得分:4)

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

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

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

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

最终花絮:查看您的应用链接到的Qt DLL。如果他们的名字以' d' (例如Qt5Cored.dllQt5Guid.dll),这意味着它们是调试版本。发行版本不具备“'后缀(例如Qt5Core.dllQt5Gui.dll

答案 2 :(得分:2)

  • 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压缩)。

答案 3 :(得分:0)

根据您使用的构建工具包从qt的命令提示符运行windeployqt.exe。不需要“ --compiler-runtime标志”。