windeployqt пропускает некоторые библиотеки и получает другие, которые не требуются

обычно для развертывания проекта Qt я либо:

  1. продолжайте работать и найдите библиотеки, которые он жалуется, отсутствуют и добавьте их, пока их больше нет.
  2. используйте dependency walker, чтобы получить меня большую часть пути (если не все), а затем вернуться к варианту 1.
  3. или просто создать статически связанную версию (боль в заднице иногда)

поэтому я теперь хотел попробовать windeployqt, который для меня существует в D:installQt.5mingw492_32bin

затем Я запустил его, используя:

D:>D:installQt.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.

однако, когда я запускаю свой исполняемый файл, я получаю ошибку, что он не может найти следующие библиотеки:

  • libgcc_s_dw2-1.dll файлы
  • libstdc++-6.dll файлы
  • libwinpthread-1.dll файлы

Я вручную добавил их из того же папка (D:installQt.5mingw492_32bin) и он отлично работает. Мои вопросы:

  1. почему он пропускает эти файлы?
  2. как я могу заставить его их взять?
  3. 1GB libs показался мне немного чрезмерным, поэтому я обошел и удалил несколько, которые, как я думал, мне не нужны, и мой исполняемый файл все еще работает нормально. Итак, как вы можете сделать windeployqt более эффективным и просто получить необходимые DLL?

без ответа на эти вопросы я считаю, что этот инструмент немного бесполезен для меня так как я могу сделать лучше себя.... Вероятно, я мог бы написать что-то, чтобы продолжать его запускать и читать ошибку и копировать соответствующую dll :o

редактировать

следующие папки (с dll), где добавлены, но они составляют только 75 МБ... справедливости ради, почти 1GB из-за webkit, quick, gui и других больших Qt-библиотек, которые я использую:

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

3 ответов


  1. почему он пропускает эти файлы?

эти файлы связаны с библиотекой времени выполнения mingw, они не принадлежат Qt, и поэтому windeployqt не добавляет их по умолчанию.

  1. как я могу заставить его их взять?

чтобы сделать windeployqt добавить их в каталог развертывания, попробуйте добавить --compiler-runtime переключитесь на свою команду. Обратите внимание, что вы должны использовать командную строку Qt предоставляет в своем меню "Пуск" ярлыки вместо поиска пути windeployqt самостоятельно.

  1. 1GB libs показался мне немного чрезмерным, поэтому я обошел и удалил несколько, которые, как я думал, мне не нужны, и мой исполняемый файл все еще работает нормально. Итак, как вы можете сделать windeployqt более эффективным и просто получить необходимые DLL?

Я думаю, что вы зависите от слишком многих модулей в вашем проекте, поэтому в том числе все их dll-файлы должны быть большими, не уверен, однако, о dll-файлах, которые вы исключаете, и как ваша программа работает нормально без них. возможно, вы можете назвать некоторые из dll-файлов, которые не требуются. И, конечно, у вас всегда есть возможность статического здания (что приведет к меньшему и более чистому размеру развертывания), пока вы не нарушите лицензию.


@Mike уже дал исчерпывающие ответы на ваши вопросы, касающиеся windeployqt. Я хотел бы обратиться к чему-то, что не является частью вашего основного вопроса, но все еще очень важно:

  1. 1GB libs показался мне немного чрезмерным

основная причина, по которой ваши библиотеки DLL настолько велики, заключается в том, что вы создали отладочную сборку. Отладка приложений / DLL содержит много дополнительного кода и информации, которые помогут вам отладить приложение. Например, если сбой программы, отладчик может распечатать полезную информацию о том, где произошел сбой и какие шаги привели к сбою. Однако этот дополнительный код и информация занимают много места. Не следует распространять отладочные сборки среди пользователей.

если вы создадите сборку выпуска, ваш компилятор пропустит весь этот дополнительный отладочный код и информацию, что значительно сокращает ваши DLL. Компилятор также будет выполнять все виды оптимизации, которые делают ваше приложение работать быстрее. Всегда создайте сборку выпуска для загрузки другими пользователями.

Final tidbit: посмотрите на библиотеки DLL Qt, с которыми связано ваше приложение. Если их имена заканчиваются на " d "(например,Qt5Cored.dll, Qt5Guid.dll), это означает, что они являются отладочные версии. В версиях выпуска нет суффикса " d " (например,Qt5Core.dll, Qt5Gui.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 МБ (8 Мб на молнии).