Ошибка развертывания QT

Я пытаюсь развернуть приложение QT5.4.1 в Windows 7 — x86.

Как всегда, на моей машине все работает нормально, но не на машине конечного пользователя.

Когда я пытаюсь запустить приложение, оно выдает следующую ошибку:

введите здесь описание изображения

После поиска в Интернете большинство решений говорят, что мне нужно добавить папки платформ, содержащие некоторые DLL (qminimal, qoffscreen и т. д.), в пакет развертывания. Я пробовал это без успеха.

Самое смешное, что я скопировал папку установки QT на компьютер конечного пользователя и удалил все, кроме этой папки (C:\Qt\Qt5.4.1\5.4\msvc2012_opengl\plugins\platforms), и все работает нормально .

Итак, каким-то образом мое приложение ищет папки платформ в папке установки QT, а не в папке пакета развертывания.

Кто-нибудь знает, как это решить?

РЕДАКТИРОВАТЬ: мне удалось изменить все библиотеки QT на версию выпуска (без суфикса «d»). Однако, когда я компилирую свой проект, я все еще получаю некоторые dll vc++ в режиме отладки. Я проверил все конфигурации проекта в разделах "linker" и "c/c++", и все они используют конфигурации "release". Когда я запускаю программу, она выдает мне «ошибка утверждения отладки». Почему я получаю отладочные версии dll vc++?

Вот скриншот ходока зависимостей

зависимость ходок


person guilhermecgs    schedule 10.11.2015    source источник
comment
Вы пытались добавить ‹app dir›/platforms/qwindows.dll вместо ‹app dir›/plugins/platforms/qwindows.dll?   -  person Davy    schedule 10.11.2015
comment
Я бы рекомендовал использовать Dependency Walker на пользовательском компьютере, чтобы определить, какие dll отсутствуют: dependencywalker.com   -  person RedOctober    schedule 10.11.2015
comment
Разве вы не используете отладочные версии библиотек с буквой «d» в конце?   -  person ariwez    schedule 10.11.2015
comment
Да, я использую отладочные библиотеки... Я планировал решить эту проблему позже. Как вы думаете, это причина?   -  person guilhermecgs    schedule 10.11.2015
comment
Не развертывайте отладочную версию! Это может быть проблемой, и вы должны найти файл qwindowsd.dll (обратите внимание на d)   -  person Davy    schedule 10.11.2015
comment
ок, поменяю на релизные версии DLL... держись и пожелай мне удачи :-)   -  person guilhermecgs    schedule 10.11.2015
comment
Сделайте чистую компиляцию и убедитесь, что весь код является отладочным или релизным. Затем используйте winqtdeploy с правильными флагами ссылка   -  person Edwin Rodríguez    schedule 10.11.2015


Ответы (2)


Комментарии Mezzo кажутся очень актуальными. Мы регулярно развертываем коммерческие приложения Qt для Windows. Вы можете использовать обходчик зависимостей, чтобы найти зависимости, или просто дважды щелкнуть исполняемый файл и просмотреть жалобу Windows о том, какие dll отсутствуют. Просто скопируйте их в место развертывания, желательно с помощью скрипта qmake.

С dll-плагинами сложнее иметь дело. Они не отображаются как зависимости. Операционная система может жаловаться на их отсутствие (например, библиотеки dll, расположенные в подкаталоге «платформы»), или ваше приложение может просто не использовать их функциональные возможности (например, библиотеки dll в подкаталоге «форматы изображений») без каких-либо жалоб. Чтобы защитить себя от последнего случая, вы должны тщательно протестировать свое приложение.

Windows не нужен файл qt.conf. Просто создайте поддиректории "платформы", "форматы изображений"... в каталоге приложения и скопируйте туда dll-плагины. В качестве примера я показываю полное содержимое каталога приложения (mingw), которое даже при копировании на виртуальную машину работает без проблем.

моментальный снимок содержимого развернутого приложения Qt Windows

Qt5Btc1.dll — это наша собственная dll.

person adlag    schedule 11.11.2015
comment
Я решил проблему. Мой выходной файл не exe, а DLL. Внешняя программа использует эту DLL. Итак, рабочая папка - это не папка DLL, а внешняя папка программы. См.: forum.qt .io/topic/60534/error-deploying-qt5-4-1-in-windows-x86/ - person guilhermecgs; 11.11.2015

Я понимаю, что не так, хотя у меня пока нет решения. Даже без решения, я думаю, этот ответ может быть полезен.

Выход моего проекта - это DLL с графическим интерфейсом, созданным в QT.

Другая программа вызывает эту DLL, и во время DLL_PROCESS_ATTACH создается графический интерфейс QT.

Согласно документации, QT ищет плагины в:

в каталоге, содержащем исполняемый файл приложения, т. е. > QCoreApplication::applicationDirPath() + QDir::separator() + "qt.conf"

Вот почему QCoreApplication::applicationDirPath() — это не каталог развертывания, в котором находится DLL, а каталог, в котором запущена внешняя программа *.exe. Я думаю, что QT ищет файл qt.conf в этом месте *.exe

РЕДАКТИРОВАТЬ: нет ничего общего с версиями отладки или выпуска

person guilhermecgs    schedule 10.11.2015