Не удалось запустить приложение, так как не удалось найти или загрузить плагин платформы QT "windows"
Я просмотрел все вопросы, связанные с переполнением стека, и ни одно из решений не помогло мне.
Я строю приложение Qt с этой настройкой:
- Windows 7 Профессиональная x64
- Visual Studio 2012
- Qt 5.2.0 собран с
configure -developer-build -debug-and-release -opensource -nomake examples -nomake tests -platform win32-msvc2012 -no-opengl
- Проект использует QtSingleApplication (qt-solutions)
- Приложение представляет собой 32-битное приложение
- qmake запускается со следующим: -makefile -spec win32-msvc2012
- .pri использует
QMAKE_CXX += /D_USING_V110_SDK71_
Я могу нормально собирать и запускать свою программу на моей машине для разработки (отмечено выше); Я также могу установить и запустить пакет из каталога Program Files на компьютере разработчика.
Когда я устанавливаю и запускаю на компьютере с Windows Vista (несколько компьютеров)
- VC++ Redist 2012 11.0.61030.0 установлен
- VC++ Redist 2010 10.0.40219 установлен
- плюс версии 2005, 2008 redist
(также не работает при чистой установке Windows 7)
Я получил:
Application failed to start because it could not find or load the QT platform plugin "windows"
Поэтому я следовал инструкциям и добавил каталог.platforms/ и добавил qwindows.dll (также добавили qminimal.dll и qoffscreen.dll); Я также добавил libEGL.dll, libGLESv2.dll (хотя я не нуждаюсь в них, я не думаю)
После того, как я добавил qoffscreen.dll, теперь я получаю дополнительное сообщение: Available platform plugins are: offscreen
Если я запускаю Dependency Walker, я получаю эту ошибку в списке:
GetProcAddress(0x76CA0000 [KERNEL32.DLL], "GetCurrentPackageId") called from "MSVCR110.DLL" at address 0x6AC6FDFA and returned NULL. Error: The specified procedure could not be found (127).
а затем дальше вниз:
GetProcAddress(0x745A0000 [UXTHEME.DLL], "BufferedPaintUnInit") called from "COMCTL32.DLL" at address 0x745FFBF8 and returned 0x745AE18C.
This application failed to start because it could not find or load the Qt platform plugin "windows".
Available platform plugins are: offscreen.
Reinstalling the application may fix this problem.
Любые идеи, как исправить эту проблему DLL?
12 ответов
Ну, я решил свою проблему, хотя я не уверен, в чем разница:
Я скопировал каждую DLL из моего каталога qt в./ и./platforms моего каталога приложения.
Приложение прошло ошибку, но затем упало.
VERSION.dll вызывал сбой (отмеченный в обходчике зависимостей), поэтому я удалил его из обоих мест.
Приложение запустилось, поэтому я систематически удалял все ненужные DLL.
Это вернуло меня в прежнее состояние.
Затем я удалил свое приложение и переустановил (оставив только файл./platforms/qwindows.dll), приложение работает правильно.
Таким образом, все, что я могу предположить, - то, что у меня была неправильная версия qwindows.dll в каталоге платформ.
Ошибка вызвана тем, что программа не может найти qwindows.dll
qwindows.dll
должен быть в папке с именем platforms
так что путь от вашего исполняемого файла до DLL platforms/qwindows.dll
Тогда как в моем случае этого было недостаточно. Я также должен был добавить следующую строку в начале моего main()
QCoreApplication::addLibraryPath("./");
Тогда все заработало.
Приложение может работать на хост-системе, так как Qt bin
путь в системе PATH
переменная.
Существует стандартный инструмент Qt для развертывания приложений Qt в Windows. windeployqt
чтобы иметь возможность запускать приложение на целевых машинах, на которых не установлен Qt.
Этот инструмент заботится о зависимостях Qt DLL, делает копию platforms\qwindows.dll
а также создает копии библиотек, которые вы не можете обнаружить с помощью Dependency Walker, поскольку подключаемые модули изображений и некоторые другие библиотеки DLL загружаются во время выполнения.
Вам даже не нужно иметь свой Qt bin
папка в вашей среде PATH
, Самое простое развертывание:
- копия построена
exe
бинарный в новую папку - открыть
cmd
консоль в этой папке - вызов
windeployqt
используя полный путь (если его нет в системеPATH
) и укажите свой исполняемый файл, например:c:\Qt\Qt5.2.1\5.2.1\msvc2010_opengl\bin\windeployqt.exe application.exe
В результате у вас есть в этой папке все необходимые библиотеки Qt DLL для запуска приложения.
Инструмент windeployqt
имеет различные варианты. Он также может позаботиться о развертывании qml
связанные файлы.
Конечно, у вас также могут быть проблемы с распространяемыми MSVC, но они должны быть развернуты отдельно и установлены один раз для каждой системы.
Только некоторые сторонние библиотеки должны быть скопированы вручную, если они используются, например, OpenSSL.
Я получил эту проблему и как я решил ее:
Использовал средство обхода зависимостей ( http://www.dependencywalker.com/), чтобы увидеть точный путь необходимых библиотек. Попробуйте, потому что и QtCreator, и QT framework имеют одинаковые dll, и вы должны точно указать, какие из них используются. Я скопировал все необходимые библиотеки в ту же папку, что и приложение.
Я скопировал папку платформы из QT framework /plugins и скопировал ее в ту же папку, что и приложение. Теперь приложение содержит также плагин / платформа / папка со всеми своими библиотеками
И самый важный шаг в моем случае - создать файл с именем qt.conf в той же папке, что и приложение. Этот файл должен содержать путь к плагинам. Мой файл qt.conf содержит:
[Путь]
Библиотеки =../ Библиотека / QtCreator
Плагины = плагины
Импорт = импорт
Qml2Imports= QML
У меня возникла та же проблема: "Приложение не удалось запустить, потому что оно не могло найти или загрузить плагин платформы QT" Windows ". Я исправил это, скопировав следующие файлы в папку app.exe (исполняемый файл моего приложения),
Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll и каталог "платформы" с qminimal.dll, qoffscreen.dll, qwindows.dll.
Я надеюсь, что это поможет кому-то
Обратите внимание, что эта проблема также может быть вызвана, если путь поиска для qwindows.dll
который закодирован в вашем приложении, включает путь, по которому вы установили Qt. Рассмотрим следующий сценарий:
- Я устанавливаю Qt в
c:\Qt\...
- Я разрабатываю приложение и правильно его развертываю где-то еще.
- Он работает на любом компьютере должным образом, потому что он включает в себя
qwindows.dll
в подкаталоге. - Я обновляю свой локальный Qt до новой версии.
- Я пытаюсь снова запустить свое приложение.
Результатом является эта ошибка, потому что qwindows.dll
в c:\Qt\...
находится перед тем в его локальном каталоге, и это несовместимо с ним. Очень надоедливый.
Решение состоит в том, чтобы разместить файл qt.conf
в той же директории, что и ваш exe-файл. Я не знаю, как этого избежать. Если вы использовали инструмент windeployqt.exe
для развертывания приложения, поэтому у вас есть подкаталог с именем platforms
тогда этого достаточно:
[Paths]
Plugins=.
Для меня мне нужно было установить QT_QPA_PLATFORM_PLUGIN_PATH
в каталог платформ, а затем он работал.
Для чего это стоит, это решение также упоминалось на GitHub.
Для людей, которые имеют эту проблему в будущем - у меня есть грязный маленький взлом, работал на меня. Попробуйте на свой страх и риск.
Выполните все шаги в Первоначальном развертывании (Быстрое и грязное) [ http://wiki.qt.io/Deploy_an_Application_on_Windows]
- Закройте Qt Creator.
- Скопируйте следующее в C:\Deployment\ Выпускная версия MyApp.exe Все файлы DLL из C:\Qt\5.2.1\mingw48_32\bin\ Все папки из C: \ Qt \ 5.2.1 \ mingw48_32 \ плагины \
- (Если вы использовали QML) Все папки из C:\Qt\5.2.1\mingw48_32\qml\ Переименуйте C: \ Qt \ в C:\QtHidden\ (Это превращает ваш компьютер в чистую среду, такую же, как не установлена Qt).
- Запустите C:\Deployment\MyApp.exe.
Теперь для взлома -
- Дублируйте вашу папку для безопасности
- Если ваш файл был в /cat/Deployment, перейдите в / cat
- Теперь удалите папку развертывания, пока EXE-файл все еще работает.
- Он скажет вам, что он не может удалить определенные файлы, так что пропустите (или пропустите все)
- То, что у вас осталось, это список всех DLL-файлов, которые ваш.exe фактически использовал и не мог удалить: список всех файлов и только те файлы, которые вам нужно сохранить.
Вы можете закрыть файл.exe сейчас. Чтобы проверить, нормально ли оно разворачивается, перейдите в папку, где вы его установили, скажем, C:/Qt и переименуйте его в C:/NotQt (в основном, делает Qt невидимым для системы). Если он работает сейчас, он будет развертываться в других системах чаще, чем нет.
В нем отсутствует qwindows.dll, который обычно должен быть на платформах, если вы не добавите:
QCoreApplication::addLibraryPath("<yourpath>");
Если вы этого не сделаете, и поместите свой qwindows.dll в другое место, Qt будет искать в вашей PATH библиотеку DLL, что может занять много времени (10 с - несколько минут)!
Я получил ту же проблему: 1. он может работать в VS2010; 2. он может работать в папке с файлами как: app.exe \platform \qwindows.dll ...
- но он не смог загрузить qwindows на чистую машину с той же ОС, что и у разрабатываемой.
Решается просто путем перемещения папки платформы в плагины: app.exe plugins\platform \ qwindows.dll
плюс: qwindows.dll может быть переименован как угодно, так как это запрашивается плагином Interafce: qt_plugin_query_metadata()
Я исправил это, поместив qt.conf
в папке exe моего приложения:
[Paths]
Prefix=C:/Qt/Qt5.11.2/5.11.2/msvc2017
Куда:
- Я установил пользовательский набор Qt в
C:\Qt\Qt5.11.2\5.11.2\msvc2017
qt.conf
информирует приложение, где пользовательский комплект черезPrefix
имущество. Обратите внимание на использование прямых, а не обратных (!)- И, опционально, папка bin набора Qt включена в мой
PATH
переменная окружения
определяющий Prefix
в вашем qt.conf
файл позволяет найти qwindows.dll
Плагин платформы, когда ваше приложение запускается.
Вам нужно добавить переменную окружения QT_QPA_PLATFORM_PLUGIN_PATH
в систему, которая указывает на каталог платформ в плагинах QT. В моем случае я использовал Anaconda и PySide2. Поэтому мой путь к каталогу былC:\ProgramData\Anaconda3\envs\cv\Lib\site-packages\PySide2\plugins
. Это устраняет проблему для каждого проекта QT. В противном случае у вас есть каталог для копирования платформ в каждый проект QT.
Перепробовал все вышеперечисленное - оказалось для меня это просто потому, что у меня не было основного Qt
dlls в apps
папка
- Qt5Core.dll
- Qt5Widgets.dll
- так далее