Qt 5.1.1: приложение не запускалось, потому что отсутствует плагин для плагинов платформы


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


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

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

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

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

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

Однако, начиная с "release" -Folder, я получаю следующее сообщение:

Это приложение не удалось запустить, поскольку оно не могло найти или загрузить Плагин платформы 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\плагинов\платформ, включая, например, qwindows.dll. Не имеет значения, переименую ли я его на "платформу", как это делали некоторые другие пользователи. Qt все еще не находит "окна плагинов платформы", где моя ошибка?

Ответ 1

Хорошо, как размещено здесь fooobar.com/questions/28982/... без особого внимания со стороны других пользователей:

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

Ответ 2

Я создал каталог платформ рядом с моим местоположением exe и поместил qwindows.dll внутрь, но я все равно получил "Не удалось загрузить плагин платформы платформы". Доступными платформами являются: "Ошибка окна".

Я скопировал qwindows.dll из C:\Qt\Qt5.1.1\Tools\QtCreator\bin\plugins\платформ, который не является правильным местом. Я просмотрел журнал отладки, запущенный в 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, все работало нормально.

Ответ 3

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

Создайте папку с именем "платформы" в том же каталоге, что и файл application.exe. Скопируйте и вставьте файл qwindows.dll, находящийся в /bin любого компилятора, который вы использовали для выпуска своего приложения, в папку "платформы". Как магия это работает. Если .dll нет, проверьте плагины/платформы/(с плагинами/находящимися в том же каталоге, что и bin/): PfunnyGuy comment.

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

Также еще один полезный совет, Qt поставляется с консольными приложениями платформы, которые будут добавлять все зависимости (включая такие, как qwindows.dll и libEGL.dll) в папку вашего развернутого исполняемого файла. Приложение для Windows называется windeployqt, а документацию можно найти здесь http://doc.qt.io/qt-5/windows-deployment.html.

Ответ 5

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

Мой коллега установил 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.

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

QCoreApplication::addLibraryPath(".");

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

int main( int argc, char *argv[] )
{
    QCoreApplication::addLibraryPath(".");
    QApplication app( argc, argv );
    ...
    return app.exec();
}

Ответ 6

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

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

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

Ответ 7

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

[Paths]
Prefix = .

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

Ответ 8

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

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

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

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

Ответ 9

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

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

QT_QPA_PLATFORM_PLUGIN_PATH:% QTDIR%\plugins\платформ\

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

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

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

DATAS = [( 'C:\Miniconda3\pkgs\Qt-5.6.2-vc14_3\Library\Plugins\платформы *.dll', "платформы" ),]

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

Ответ 10

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

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

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

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

Я надеюсь, что это решение вам подходит.

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

Ответ 11

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

Ответ 12

Используйте этот пакетный файл: 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 из командной строки

Ответ 13

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

Ответ 14

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

@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

Ответ 15

Допустим, вы хотели иметь портативную версию CGAL-Demos. Таким образом, у вас будет папка "CGAL", и в ней 1 подпапка с именем "lib": все (общие) файлы поддержки для любых программ в CGAL -folder находятся здесь. В нашем примере это будет Dll-Download: просто распакуйте в каталог "lib". Чем дальше вы прокручиваете страницу демо, тем более впечатляющим является контент. В моем случае демо-многогранник показался мне правильным. Если это работает на моем ноутбуке 10+, я впечатлен. Поэтому я создал папку "demo" в "CGAL" -directory рядом с "lib". Теперь создайте .cmd файл в этой папке. Я назвал мой "Многогранник .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" -folder, так как странный "% ~ dp0" -wriggle представляет полный путь к *.cmd файлу, который мы начали, с завершающим "\". Так что "% me% lib" - это всегда полный путь к реальной библиотеке (в моем случае "CGAL\lib"). Следующие 2 строки сообщают Qt, где находятся его файлы времени выполнения. Это будет как минимум файл "qwindows.dll" для программ Windows-Qt плюс любое количество *.dll. Если я правильно помню, у библиотеки Dll (по крайней мере, когда я ее скачал) была небольшая "ошибка", поскольку она содержит "платформы" -directory с qwindows.dll в ней. Поэтому, когда вы открываете каталог lib, вам нужно создать папку "плагины" рядом с "платформами", а затем перейти в "плагины". Если Qt-приложение, любое Qt-приложение, не находит "qwindows.dll", оно не может найти "windows". И он ожидает это в каталоге с именем "platform" в каталоге "plugins", о котором он должен сообщить ОС, на которой она работает... и если QT_PLUGIN_PATH не точно указывает на все вспомогательные файлы необходимо, чтобы некоторые Qt-программы по-прежнему работали без проб. И некоторые жалуются на отсутствие *.dll, которые вы никогда не слышали...

Ответ 16

Эй, ребята, только учусь, но эта тема очень помогла. Это была сборка mingw с использованием компонентов mingw-w64-qt5. Мне повезло, и я попробовал пробиться в вине. Он исключил ошибку, указывающую на .dll, не указанную в других отсутствующих ошибках .dll, и сказал, что от него зависит qwindows.dll, как упоминалось выше. Не решение, очевидно. но он подчеркивает то, что было сказано ранее, что даже если каталог платформы и другие вещи выполнены правильно, он откажется работать, если qwindows.dll имеет неудовлетворенные зависимости. Ошибка Windows может быть очень обманчива, учитывая, сколько возможных причин для этого, что делает советы, которые здесь приводят, очень полезны.

Ответ 17

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