Qt 5.1.1: Не удалось запустить приложение из-за отсутствия плагина платформы «windows»

124

Изменить: некоторые люди начали отмечать мой вопрос как дубликат. Не забывайте, что когда я задавал этот вопрос, существовало много похожих вопросов (см., Например, список ниже). Однако ни один из этих ответов не решил мою проблему . После долгого поиска я нашел комментарий, который игнорировали все пользователи, указывающие на отсутствующую библиотеку. Теперь, много месяцев спустя, комментарий был заменен на ответ. Однако, когда я сам ответил на этот вопрос, я намеревался помочь другим людям, напрямую предоставив решение. Об этом нельзя забывать, и пока что мой ответ помог многим людям. Поэтому мой вопрос точно не повторяется. Кстати: принятый ответ по указанной сверху ссылке не решает проблему !


Да, пользовался поиском:

Не удалось загрузить плагин платформы "windows". Доступные платформы: Ошибка

Развертывание приложения Qt C ++ из Visual Studio ошибка qwindows.dll

не удалось загрузить плагин платформы "windows" Доступные платформы: windows, минимальный

Однако в моем случае проблема все еще сохраняется. Я использую Qt 5.1.1 с Visual Studio 2012 и разработал свое приложение для Windows 7 с Qt Creator 2.8.1. Приложение скомпилировано в режиме «Release» и может быть выполнено, если оно запущено напрямую с Qt Creator.

Однако при запуске из папки «release» я получаю следующее сообщение:

Это приложение не удалось запустить, потому что оно не могло найти или загрузить "окна" плагина платформы Qt. Доступные плагины платформы: минимальные, закадровые, окна.

Структура папки выглядит так:

release
+ gui.exe
+ icudt51.dll
+ icuin51.dll
+ icuuc51.dll
+ libGLESv2.dll
+ Qt5Core.dll
+ Qt5Gui.dll
+ Qt5Widgets.dll
+ platforms

Платформы - это папка, напрямую скопированная из Qt \ Qt5.1.1 \ 5.1.1 \ msvc2012 \ plugins \ platform, включая, например, qwindows.dll. Не имеет значения, переименовал ли я его в «платформу», как это сделали некоторые другие пользователи. Qt все еще не находит "окна плагинов платформы", в чем моя ошибка?

анонимное
источник
5
У меня была аналогичная проблема. Windows 8.1 Qt 5.3.1 MinGW 32, динамическое связывание. Решается копированием DLL из папки Qt в ../MyApp/platforms/qwindows.dll. Примечание: в пути нет каталога "plugins"
Дмитрий
При аналогичных проблемах используйте инструмент Depends, который покажет вам зависимости DLL и проблемы, связанные с ними. Вы можете использовать этот инструмент для статического анализа файла exe или dll, а также использовать его для отображения запуска приложения с динамически загружаемыми библиотеками DLL.
Flovdis
Используйте windeployQt
CrippledTable

Ответы:

64

Хорошо, как написано здесь https://stackoverflow.com/a/17271172/1458552 без особого внимания со стороны других пользователей:

LibEGL.dll не хватало! Хотя об этом не сообщалось при попытке запустить приложение (сообщалось обо всех других * .dll, таких как Qt5Gui.dll).

анонимное
источник
2
В моем случае: Qt \ Qt5.1.1 \ 5.1.1 \ msvc2012 \ bin (конечно, в зависимости от вашей версии Visual Studio)
Anonymous
8
как вы узнали, что отсутствующая dll была libEGL?
user1493046 05
4
ВЫ СОХРАНИЛИ МЕНЯ ЧАСЫ! Была такая же проблема на Qt 5.3.1
tarabyte
4
@ user1493046 Мне удалось воспроизвести это, используя зависимости и его режим профилирования (F7). После того, как приложение запустилось и показало ошибку, в списке зависимостей появилась libEGL.dll.
Lapis
17
Добавление libEGL.dll не помогло. Однако установка следующей переменной окружения сработала для меня: QT_QPA_PLATFORM_PLUGIN_PATH =% QTDIR% \ plugins \ platform \
arsalank2
36

Я создал каталог платформ рядом с местом расположения исполняемого файла и поместил внутрь qwindows.dll, но по-прежнему получал сообщение об ошибке «Не удалось загрузить плагин платформы» Windows. Доступные платформы: Windows ».

Я скопировал qwindows.dll из C: \ Qt \ Qt5.1.1 \ Tools \ QtCreator \ bin \ plugins \ platform, что не подходит. Я просмотрел журнал отладки при запуске в Qt Creator и обнаружил, что мое приложение просматривало C: \ Qt \ Qt5.1.1 \ 5.1.1 \ mingw48_32 \ plugins \ platform, когда оно запускалось в отладчике.

Когда я скопировал из C: \ Qt \ Qt5.1.1 \ 5.1.1 \ mingw48_32 \ plugins \ platform, все работало нормально.

Brandon
источник
38
У меня сработала установка следующей переменной среды: QT_QPA_PLATFORM_PLUGIN_PATH =% QTDIR% \ plugins \ platform \
arsalank2
24

В выпуске, вероятно, отсутствует библиотека / плагин или библиотека находится в неправильном каталоге или из неправильного каталога.

Предполагаемый ответ Qt: используйте windeployqt . см. последний абзац для объяснения

Ручной ответ:

Создайте папку с именем «platform» в том же каталоге, что и файл application.exe. Скопируйте и вставьте qwindows.dll, который находится в каталоге / bin того компилятора, который вы использовали для выпуска своего приложения, в папку «platform». Как по волшебству это работает. Если .dll там нет, проверьте plugins / platform / (где plugins / находятся в том же каталоге, что и bin /) <- Комментарий PfunnyGuy.

Похоже, что распространенная проблема заключается в том, что .dll был взят из неправильного бункера компилятора. Обязательно скопируйте файл qwindows.dll из того же компилятора, который использовался для выпуска вашего приложения.

Qt поставляется с консольными приложениями платформы, которые будут добавлять все зависимости (включая такие, как qwindows.dll и libEGL.dll) в папку вашего развернутого исполняемого файла. Это предполагаемый способ развертывания вашего приложения, поэтому вы не пропустите ни одной библиотеки (что является основной проблемой для всех этих ответов). Приложение для Windows называется windeployqt . Вероятно, для каждой ОС существует приложение консоли развертывания.

CrippledTable
источник
1
Это то, что мне нужно: обратите внимание, qwindows.dll находится не в bin / вашей установки платформы Qt, а в plugins / platform /, причем plugins / находятся в том же каталоге, что и bin /
PfunnyGuy
1
Спасибо! Таким образом, это файлы: Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll и YourApp.exe в основном каталоге, а также платформы \ qwindows.dll и платформы \ libEGL.dll в подкаталоге.
Pierre
1
windeployqt - правильный ответ. Я использовал его, и он скопировал все необходимое рядом с .exe. Это избавляет от догадок о том, какая dll нужна, а какая нет
Х. Аль-Амри
14

У меня сработала установка QT_QPA_PLATFORM_PLUGIN_PATHпеременной среды на% QTDIR% \ plugins \ platform \ .

Об этом также упоминалось здесь и здесь .

Джим Г.
источник
3
Хотя этот ответ может заставить его работать на вашем текущем компьютере, он не помогает другим, кто пытается развернуть свои программы на других машинах и которым необходимо конкретно определить, какие библиотеки отсутствуют / требуются.
RTbecard
1
в 2017 году это сработало для меня. Я не буду развертывать никаких приложений! С помощью создателя Qt просто откройте \ Новый файл или проект ... \ Приложение Qt Widgets, затем запустите, и он вылетит с тем же сообщением. Установка этого var мне поможет.
Phiber 01
Просто скопируйте папку плагинов где-нибудь рядом с вашим импровизированным «дистрибутивом» и укажите на него env var - должно работать (не нужно использовать «QTDIR») :)
mlvljr
9

Я столкнулся с этим, и ни один из ответов, которые я не мог найти, не помог мне.

У моего коллеги Qt (5.6.0) установлен на его машине по адресу: C: \ Qt \ Qt5.6.0 \ 5.6 \ msvc2015 \ plugins.
У меня Qt (5.6.2) установлен в том же месте.

Я узнал из этого сообщения: http://www.tripleboot.org/?p=536 , что Qt5Core.dll имеет местоположение для плагинов, записанных в него при первой установке Qt. Поскольку каталоги моего коллеги и Qt были одинаковыми, но были установлены разные версии Qt, необходим другой файл qwindows.dll. Когда я запускал развернутый им exe-файл, он использовал мой файл C: \ Qt \ Qt5.6.0 \ 5.6 \ msvc2015 \ plugins \ platform \ qwindows.dll вместо того, который находится рядом с исполняемым файлом в подпапке. \ Platform.

Чтобы обойти это, я добавил в приложение следующую строку кода, которая, кажется, вынуждает его искать подпапку «платформы» рядом с исполняемым файлом, прежде чем искать путь в Qt5Core.dll.

QCoreApplication::addLibraryPath(".");

Я добавил эту строку к основному методу перед вызовом QApplication следующим образом:

int main( int argc, char *argv[] )
{
    QCoreApplication::addLibraryPath(".");
    QApplication app( argc, argv );
    ...
    return app.exec();
}
Joel
источник
1
Этот сработал для меня ... но обратите внимание, что вам может понадобиться qwindowsd.dllкаталог `platform`, если вы оказались в ситуации, когда вы
делитесь
Этот сработал для меня, потому что упоминание qwindowsd.dll, я знал, что мое приложение было скомпилировано в режиме отладки, и я установил библиотеки Qtxxxd.dll, но использовал qwindows.dll в папке платформы.
Густаво Родригес
6

создать каталог platforms и скопировать qwindows.dllв него, platformsи app.exeнаходятся в том же каталоге

cd app_dir mkdir platforms xcopy qwindows.dll platforms\qwindows.dll

Структура папки + app.exe + platforms\qwindows.dll

Куньмин Се
источник
В вопросе упоминается, что «Платформы - это папка, напрямую скопированная из Qt \ Qt5.1.1 \ 5.1.1 \ msvc2012 \ plugins \ platform, включая, например, qwindows.dll.»
parasietje
Приложение @parasietje ищет qwindows.dllв каталоге platforms. Я публикую это, потому что исправил. Вы делаете тест перед голосованием против?
KunMing Xie
Ваш ответ не отвечает на исходный вопрос. Ваш ответ предполагает то, что автор оригинального плаката уже пробовал.
parasietje
3

Нашел другое решение. Создайте qt.conf в папке приложения как таковой:

[Paths]
Prefix = .

А затем скопируйте папку плагинов в папку приложения, и у меня все работает.

Питер Куиринг
источник
Хорошо, я нахожусь в среде minGW, CMake, Qt 5.12, где применение инструмента windeploy невозможно. Папка платформ была там, но не работала. Замена на Qt-lib тоже не помогла. Исправлено с помощью вашей уловки (после копирования папки). Спасибо!
Марсель Петрик
2

Большинство этих ответов содержат хорошую (правильную) информацию, но в моем случае чего-то не хватало.

Мое приложение построено как библиотека (dll) и вызывается приложением, отличным от Qt. Раньше я windeployqt.exeустанавливал библиотеки Qt, платформы, плагины и т. Д. В установочном каталоге, но платформа все равно не находила. После некоторых экспериментов я понял, что рабочий каталог приложения находится в другой папке. Итак, я взял каталог, в котором «жила» dll, GetModuleHandleExAи добавил этот каталог в путь к библиотеке Qt во время выполнения, используя

QCoreApplication::addLibraryPath(<result of GetModuleHandleExA>);

Это сработало для меня.

Джейкоб Роббинс
источник
2

Для меня решением было исправить PATHпеременную. Он имел Anaconda3 \ Library \ bin в качестве одного из первых путей. Этот каталог содержит некоторые библиотеки Qt, но не все. Видимо, это проблема. Перемещение C: \ Programs \ Qt \ 5.12.3 \ msvc2017_64 \ bin на передний план PATHрешило проблему для меня.

Янн Поппинга
источник
1

У меня была эта проблема при использовании QT 5.6, Anaconda 4.3.23, python 3.5.2 и pyinstaller 3.3. Я создал программу на Python с интерфейсом, разработанным с использованием QTcreator, но мне пришлось развернуть ее на других компьютерах, поэтому мне нужно было создать исполняемый файл с помощью pyinstaller.

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

QT_QPA_PLATFORM_PLUGIN_PATH:% QTDIR% \ plugins \ platform \

QTDIR: C: \ Miniconda3 \ pkgs \ qt-5.6.2-vc14_3 \ Library

Но это решение работало только на моем ПК, на котором в этих папках были установлены conda и qt.

Чтобы решить эту проблему и заставить исполняемый файл работать на любом компьютере, мне пришлось отредактировать ".spec" (файл, сначала созданный pyinstaller), включив в него следующую строку:

datas = [('C: \ Miniconda3 \ pkgs \ qt-5.6.2-vc14_3 \ Library \ plugins \ platform * .dll', 'platform'),]

Это решение основано на ответах Джима Г. и CrippledTable.

Лебсен Ван де Грааф
источник
1

У меня была такая же проблема, и я решил ее, применив несколько вещей. Первый, если это программа, которую вы сделали на Qt.

В папке (в моем случае) «C: \ Qt \ Qt5.10.0 \ 5.10.0 \ msvc2017_64 \ plugins» вы найдете другие папки, одна из них - «платформы». Эта папка "платформы" будет скопирована рядом с исполняемым файлом .exe. Теперь, если вы получите ошибку 0xc000007d, это значит, что вы не скопировали ту версию, которая была, поскольку она может быть 32-битной или 64-битной.

Если вы продолжите с ошибками, вам не хватает дополнительных библиотек. С помощью программы «Dependency Walker» вы можете обнаружить некоторые из недостающих папок. Конечно, он укажет вам, что вам нужен NVIDIA .dll, и сообщит вам его местоположение.

Другой способ вместо использования «Dependency Walker» - скопировать все .dll из папки «C: \ Windows \ System32» рядом с исполняемым файлом. Запустите свой .exe, и если все загружается хорошо, поэтому у вас нет места в библиотеках dll, которые вам не нужны или не используются, используйте программу .exe со всеми вашими параметрами и, не закрывая .exe, который вы делаете, сотрите все. dll, который вы только что скопировали рядом с .exe, поэтому, если эти .dll используются вашей программой, система не позволит вам стереть, а удалит только те, которые не нужны.

Надеюсь, это решение вам пригодится.

Помните, что если ваша операционная система 64-битная, библиотеки будут в папке System32, а если ваша операционная система 32-битная, они также будут в папке System32. Это происходит для того, чтобы не возникало проблем совместимости с 32-битными программами на 64-битном компьютере. Папка SysWOW64 содержит 32-битные файлы в качестве резервной копии.

гнев
источник
Это работает, но это скорее временное решение. Можно ли что-то сделать, чтобы не копировать папку платформ?
Олег Яблоков
0

Для платформы MinGW и если вы компилируете цель отладки вручную созданным специально написанным CMakeLists.txt, вам также необходимо добавить qwindows.dll в каталог платформы. Исполняемый файл windeployqt хорошо справляется со своей работой, но кажется, что по какой-то странной причине сборка CMake также нуждается в варианте выпуска. Таким образом, было бы лучше иметь и qwindows.dll, и qwindowsd.dll в каталоге вашей платформы. Я не заметил такого же странного результата при импорте проекта CMake в QtCreator и последующем запуске процедуры сборки. Компиляция в командной строке проекта CMake, похоже, вызывает зависимость qwindows.dll, если правильный для цели отладки установлен на месте (qwindowsd.dll)

Михал Турлик
источник
0

Используйте этот командный файл: RunWithQt.bat

@echo off
set QTDIR=C:\Qt\Qt5.1.1\5.1.1\msvc2012\bin
set QT_QPA_PLATFORM_PLUGIN_PATH=%QTDIR%\plugins\platforms\
start %1
  • чтобы использовать его, перетащите файл gui.exe и поместите его в RunWithQt.bat в проводнике,
  • или позвоните RunWithQt gui.exeиз командной строки
Якуб Кшесловски
источник
0

Если у вас установлена ​​Anaconda, я рекомендую вам удалить ее и попробовать установить пакет python из исходного кода, я исправил эту проблему таким образом

Кодирование Soberbia
источник
0

Приложение qtbase / bin / windeployqt.exe автоматически развертывает ваше приложение. Если вы запускаете приглашение с правильно установленными переменными envirenmentvariables, оно развертывается в текущем каталоге. Вы найдете пример сценария:

@echo off
set QTDIR=E:\QT\5110\vc2017

set INCLUDE=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\ATLMFC\include;S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\include;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\ucrt;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\shared;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\winrt;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\cppwinrt

set LIB=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\ATLMFC\lib\x86;S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\lib\x86;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x86;C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\ucrt\x86;C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x86;

set LIBPATH=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\ATLMFC\lib\x86;S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\lib\x86;S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\lib\x86\store\references;C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.17134.0;C:\ProgramFiles (x86)\Windows Kits\10\References\10.0.17134.0;C:\Windows\Microsoft.NET\Framework\v4.0.30319;

Path=%QTDIR%\qtbase\bin;%PATH%
set VCIDEInstallDir=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\
set VCINSTALLDIR=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\
set VCToolsInstallDir=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.11.25503\
set VisualStudioVersion=15.0
set VS100COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\
set VS110COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\
set VS120COMNTOOLS=S:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\
set VS150COMNTOOLS=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\
set VS80COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\
set VS90COMNTOOLS=c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
set VSINSTALLDIR=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\
set VSSDK110Install=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VSSDK\
set VSSDK150INSTALL=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VSSDK
set WindowsLibPath=C:\Program Files (x86)\Windows Kits\10\UnionMetadata;C:\Program Files (x86)\Windows Kits\10\References
set WindowsSdkBinPath=C:\Program Files (x86)\Windows Kits\10\bin\
set WindowsSdkDir=C:\Program Files (x86)\Windows Kits\10\
set WindowsSDKLibVersion=10.0.14393.0\
set WindowsSdkVerBinPath=C:\Program Files (x86)\Windows Kits\10\bin\10.0.14393.0\
set WindowsSDKVersion=10.0.14393.0\
set WindowsSDK_ExecutablePath_x64=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\
set WindowsSDK_ExecutablePath_x86=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\

mkdir C:\VCProjects\Application\Build\VS2017_QT5_11_32-Release\setup
cd C:\VCProjects\Application\Build\VS2017_QT5_11_32-Release\setup
copy /Y ..\Release\application.exe .
windeployqt application.exe
pause
MyGeertRo
источник
0

Допустим, вы хотели иметь портативные CGAL-Demos . Таким образом, у вас будет папка «CGAL», а в ней 1 подпапка с именем «lib»: сюда идут все (общие) вспомогательные DLL для любых программ в папке CGAL. В нашем примере это будет Dll-Download : просто разархивируйте в каталог «lib». Чем дальше вы прокручиваете страницу с демонстрациями , тем более впечатляющим будет контент. В моем случае многогранник-демонстрация казался правильным. Если это работает на моем ноутбуке 10+, я впечатлен. Итак, я создал папку «demo» в каталоге «CGAL» вместе с «lib». Теперь создайте в этой папке .cmd-файл. Я назвал свой "Polyhedron.cmd". Итак, у нас есть такая структура каталогов:

 CGAL - the bag for all the goodies
  lib - all libraries for all CGAL-packages
 demo - all the demos I'm interested in
[...] - certainly some other collections, several apps per folder...
Polyhedron.cmd - and a little script for every Qt-exe to make it truly portable.

В этом небольшом примере «Polyhedron.cmd» содержит следующий текст:

@echo off
set "me=%~dp0"
set PATH=%me%lib
set "QT_PLUGIN_PATH=%me%lib\plugins"
start /b "CGAL Polyhedron Demo" "%me%demo\polyhedron\polyhedron_3.exe"

Разумеется, все скрипты могут быть одинаковыми, за исключением последней строки. Единственное предостережение: «Окно DOS» остается открытым, пока вы используете реальную программу. Закройте окно оболочки, и вы также убьете * .exe. Где бы вы ни копировали папку "CGAL", странная "% ~ dp0" -wriggle представляет полный путь к * .cmd-файлу, который мы запустили, с завершающим символом "\". Таким образом, «% me% lib» - это всегда полный путь к самой библиотеке (в моем случае «CGAL \ lib»). Следующие две строки сообщают Qt, где находятся его "исполняемые" файлы. Это будет как минимум файл "qwindows.dll" для программ Windows-Qt плюс любое количество * .dll. Если я правильно помню, в Dll-библиотеке (по крайней мере, когда я ее скачал) была небольшая «ошибка», поскольку она содержит каталог «платформ» с qwindows.dll в нем.перейти в «плагины». Если приложение Qt, любое приложение Qt не находит «qwindows.dll», оно не может найти «окна». И он ожидает, что он находится в каталоге с именем «platform» в каталоге «plugins», который ему должна сообщить ОС, в которой он работает ... и если «QT_PLUGIN_PATH» не совсем указывает на все вспомогательные DLL, которые вы При необходимости некоторые Qt-программы будут работать без проблем. А некоторые жалуются на отсутствие * .dll, о которых вы никогда не слышали ...

Томас Штурм
источник
0

Для тех, кто пришел с QT версии 5.14.0, мне потребовалось 2 дня, чтобы найти это сообщение об ошибке:

windeployqt не работает с MinGW QTBUG-80763 Будет исправлено в 5.14.1

https://wiki.qt.io/Qt_5.14.0_Known_Issues

Так что имейте в виду. Использование windeployqt с MinGW приведет к той же ошибке, что указана здесь.

Яхья Тавил
источник