- Не удалось запустить приложение, так как не удалось найти или загрузить плагин платформы QT & quot; windows & quot;
- Решение
- Другие решения
- Создание системы расширения на библиотеке Qt
- Плагины(Расширения)
- Часть 1
- Этап 1:
- Этап 2:
- Этап 3:
- Часть 2
- Этап 1:
- Этап 2:
- Этап 2:
- Приложение не удалось запустить, так как не удалось найти или загрузить плагин QT platform » windows»
- 11 ответов:
Не удалось запустить приложение, так как не удалось найти или загрузить плагин платформы QT & quot; windows & quot;
Я просмотрел все вопросы, связанные с переполнением стека, и ни одно из решений не помогло мне.
Я строю приложение 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
- .при использовании 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, я получаю эту ошибку в списке:
а затем дальше вниз:
Любые идеи, как исправить эту проблему DLL?
Решение
Ошибка вызвана тем, что программа не может найти qwindows.dll
qwindows.dll должен быть в папке с именем platforms так что путь от вашего исполняемого файла до DLL platforms/qwindows.dll
Тогда как в моем случае этого было недостаточно. Я также должен был добавить следующую строку в начале моего main ()
Тогда все заработало.
Другие решения
Я получил эту проблему и как я решил ее:
Используется ходок зависимостей (http://www.dependencywalker.com/ ), чтобы увидеть точный путь необходимых DLL. Попробуйте, потому что и QtCreator, и QT framework имеют одинаковые dll, и вы должны точно указать, какие из них используются.
Я скопировал все необходимые библиотеки в ту же папку, что и приложение.
Я скопировал папку платформы из QT framework / plugins и скопировал ее в ту же папку, что и приложение. Теперь приложение содержит также плагин / платформа / папка со всеми своими библиотеками
И самый важный шаг в моем случае — это создать файл с именем qt.conf в той же папке, что и приложение. Этот файл должен содержать путь к плагинам. Мой файл qt.conf содержит:
[Путь] Библиотеки = .. / Библиотека / QtCreator
Плагины = плагины
Импорт = импорт
Qml2Imports = QML
Приложение может работать на хост-системе, так как Qt bin путь в системе PATH переменная.
Существует стандартный инструмент Qt для развертывания приложений Qt в Windows. windeployqt чтобы иметь возможность запускать приложение на целевых машинах, на которых не установлен Qt.
Этот инструмент заботится о зависимостях Qt DLL, делает копию platforms\qwindows.dll а также делает копию библиотек, которые вы не можете обнаружить с помощью Зависимость Уокер, так как подключаемые модули изображений и некоторые другие библиотеки DLL загружаются во время выполнения.
Вам даже не нужно иметь свой Qt bin папка в вашей среде PATH , Самое простое развертывание:
- копия построена exe бинарный в новую папку
- открыть cmd консоль в этой папке
- вызов windeployqt используя полный путь (если его нет в системе PATH ) и укажите свой исполняемый файл, например:
В результате у вас есть в этой папке все необходимые библиотеки Qt DLL для запуска приложения.
Инструмент windeployqt имеет различные варианты. Он также может позаботиться о развертывании qml связанные файлы.
Конечно, у вас также могут быть проблемы с распространяемыми MSVC, но они должны быть развернуты отдельно и установлены один раз для каждой системы.
Только некоторые сторонние библиотеки должны быть скопированы вручную, если они используются, например, OpenSSL.
У меня была та же проблема: «Приложение не удалось запустить, потому что оно не могло найти или загрузить плагин платформы QT». «Окна». Я исправил это, скопировав следующие файлы в папку 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 тогда этого достаточно:
Для людей, которые имеют эту проблему в будущем — у меня есть грязный маленький взлом, работал на меня. Попробуйте на свой страх и риск.
Выполните все шаги в Первоначальном развертывании (Быстрое и грязное) [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 \ Plugins \ - (Если вы использовали 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 невидимым для системы).
Если он работает сейчас, он будет развертываться в других системах чаще, чем нет.
Ну, я решил свою проблему, хотя я не уверен, в чем разница:
Я скопировал каждую DLL из моего каталога qt в ./ и ./platforms моего каталога приложения.
Приложение прошло ошибку, но затем потерпело крах.
VERSION.dll вызывал сбой (отмеченный в обходчике зависимостей), поэтому я удалил его из обоих мест.
Приложение запустилось, поэтому я систематически удалял все ненужные DLL.
Это вернуло меня в прежнее состояние.
Затем я удалил свое приложение и переустановил (оставив только файл ./platforms/qwindows.dll), приложение работает правильно.
Таким образом, все, что я могу предположить, — то, что у меня была неправильная версия qwindows.dll в каталоге платформ.
Я получил ту же проблему:
1. он может работать в VS2010;
2. он может работать в папке с файлами как:
app.exe
\ Платформы \ qwindows.dll
…
- но он не смог загрузить qwindows на чистую машину с той же ОС, что и у разрабатываемой.
Создание системы расширения на библиотеке Qt
Плагины(Расширения)
Расширения это совместно используемая динамическая библиотека предназначенная для загрузки в процессе исполнения основного приложения, которая обязательно должна реализовывать хотя бы один специальный интерфейс.
Расширения делятся на два типа:
- Для Qt
- Для собственных приложений
Разберём как создать свою систему расширений и сами расширения для него.
Связь с расширением осуществляется с помощью интерфейса (сигналы, слоты и методы класса). Расширение загружается приложением при помощи класса QPluginLoader . Для загрузки расширения используется метод instance() , который создаёт объект расширения и возвращает указатель на него. Для выгрузки расширения используется метод unload() .
Часть 1
В первом примере создадим расширение которое будет использовать функцию(алгоритм, формулу) из расширения.
Визуальная схема проекта будет выглядеть следующим образом.
Этап 1:
Первым этапом создадим класс интерфейсов наследуемый от QObject, в качестве интерфейса будет метод который принимает переменную типа QString и возвращает эту же строку в верхнем регистре. С помощью макроса Q_DECLARE_INTERFACE, задаём идентификотор интерфейсов, компилятор с генерирует метаинформацию для строки-идентификатор. Данный модуль является протоколом общения между плагином и основной программой и будет использоваться в проекте плагина и в основном проекте.
Класс будет выглядеть следующем образом.
Этап 2:
Создадим базовое приложение которое будет загружать расширение. По нажатию кнопку будет происходить поиск расширения и загрузка его в систему. Далее через интерфейс будем задействовать нашу функцию.
Этап 3:
Создание расширения, первое что нужно сделать это в pro файле изменить типа собираемого проекта, для этого нужно добавить следующую строку TEMPLATE = lib, и задать конфигурацию проекта под расширения CONFIG += plugin.
Далее создаём класс будущего расширения, класс должен быть унаследован от класса интерфейсов. Макрос Q_INTERFACES, нужен что бы компилятор с генерировал всю необходимую мета информацию для расширения. Макрос Q_PLUGIN_METADATA(), задаёт точку входа в расширение и доступ для библиотеки Qt. Также нужно создать файл inteface.json с метаинформацией(файл должен находиться в корне проекта), в нашем случае там нет информации поэтому просто запишем пустые кавычки <> в файл.
На выходе компиляции проекта мы получим файл с расширением .so, данный файл перемещаем в папку «Plugins» главного проекта и запускаем его. В данном случае расширение загружается в основную программу и создаётся единственный объект расширения. При попытки заново использовать функцию instance(), функция вернёт указатель на уже созданный объект расширения.
Часть 2
Усложним нашу задачу, теперь нам нужно что бы расширение представляло собой виджет и что бы была возможность создавать несколько таких виджетов. Основная программа будет принимать сообщения от плагинов и отправлять обратно ответ. Создадим новые проекты, на первом этапе нам понадобиться два класса интерфейсов, один будет отвечать за загрузку расширения и создания виджета, другой за работу самого виджета.
Схема проекта будет выглядеть следующим образом:
Этап 1:
Первый класс interface будет иметь две функции, получить названия плагина и получить виджет плагина. Название плагина будем хранить для индентификации его в системе. Виджет плагина мы будем добавлять в MDI окна основного приложения.
Второй класс является самим графическим виджетом, он унаследован от QWidget, здесь мы прописали необходимые нам функции, виджет будет получать сообщение и отправлять в основную программу.
Этап 2:
Основная программа состоит из MDI окна, в котором есть основной виджет для принятия сообщений от плагинов и дополнительные окна, которые динамически появляются по мере вызова плагинов.
При создания виджета плагина мы соединяем сигнал от плагина со слотом и с помощью функции sender() мы получаем указатель на плагин который прислал сообщение. Созданный виджет мы помещаем в MDI окно, а сам объект плагина можно выгрузить из системы.
Основное окно, принимает сообщение и отображает его.
Этап 2:
Создаём плагин, его идея состоит в том что он является фабрикой для создания виджета.
Приложение не удалось запустить, так как не удалось найти или загрузить плагин QT platform » windows»
Я просмотрел все вопросы, которые, по-видимому, связаны с переполнением стека, и ни одно из решений, кажется, не помогает мне.
Я создаю приложение Qt с этой настройкой:
- Windows 7 Professional 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
(также терпит неудачу на a чистая установка Windows 7)
Application failed to start because it could not find or load the QT platform plugin «windows»
Поэтому я последовал инструкциям и добавил a .платформы / каталог, и добавил qwindows.dll (также добавлен qminimal.dll и qoffscreen.dll); я также добавил libEGL.dll, libGLESv2.dll (хотя я не думаю, что они мне понадобятся)
Однажды я добавил qoffscreen.dll теперь я получаю дополнительное сообщение: Available platform plugins are: offscreen
Если я пробегаю через Dependency Walker, я получаю эту ошибку в списке:
А затем еще ниже получаем the:
Есть идеи, как исправить эту проблему dll?
11 ответов:
Ошибка вызвана тем, что программа не может найти qwindows.dll
qwindows.dll должен находиться в папке с именем platforms , так что путь от вашего исполняемого файла к dll будет platforms/qwindows.dll
Хотя в моем случае этого было недостаточно. Мне также пришлось добавить следующую строку в начале моего main () Тогда все сработало.
Я получил эту проблему и как я ее решил:
Используемая зависимость walker (http://www.dependencywalker.com/), чтобы увидеть точный путь необходимых библиотек DLL. Попробуйте, потому что и QtCreator, и Qt framework имеют одинаковые библиотеки DLL, и вы должны точно определить, какие из них используются. Я скопировал все необходимые библиотеки DLL в ту же папку, что и приложение.
Я скопировал папку platforms из Qt framework / plugins и скопировал ее в ту же папку, что и приложение. Теперь приложение вступило в силу также плагин / платформа / папка со всеми своими DLL
И самым важным шагом в моем случае является создание файла с именем qt.conf в той же папке, что и приложение . Этот файл должен содержать путь к плагинам. Мой qt.файл conf содержит:
[пути]
Библиотеки=../lib / qtcreator
Plugins=Плагины
Импорт=импорт
Qml2Imports=qml
Приложение может работать на хост-системе, так как путь Qt bin находится в переменной system PATH .
Существует стандартный инструмент Qt для развертывания приложений Qt на Windows windeployqt чтобы иметь возможность запускать приложение на целевых машинах, на которых не установлен Qt.
Этот инструмент заботится о зависимостях Qt DLL, делает копию platforms\qwindows.dll , а также делает копию библиотек, которые вы не можете обнаружить с помощью Dependency Walker , так как Плагины изображений и некоторые другие библиотеки DLL загружаются во время выполнения.
Вам даже не нужно иметь папку Qt bin в вашей среде PATH . Самое простое развертывание:
- скопировать построенный exe двоичный файл в новую папку
- откройте консоль cmd в этой папке
- вызовите windeployqt используя полный путь (если его нет в системе PATH ) и предоставьте свой исполняемый файл, например:
В результате у вас есть в этой папке все необходимые библиотеки DLL Qt, чтобы запустить приложение.
Инструмент windeployqt имеет различные опции. Он также может позаботиться о развертывании связанных файлов qml .
Конечно, вы можете иметь также проблемы с MSVC redistributables, но они должны быть развернуты отдельно и установлены один раз в системе.
Только некоторые сторонние библиотеки должны быть скопированы вручную, если они используются, например OpenSSL.
У меня была та же проблема «приложение не удалось запустить, потому что он не мог найти или загрузить Qt platform plugin» windows» Я исправил это, скопировав файлы ниже в приложение.папка exe (my app executable),
Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll и каталог «платформ» с qminimal.проблемы, qoffscreen.dll, qwindows.файл DLL.
Я надеюсь, что это кому-то поможет
Примечание эта проблема можеттакже быть вызвана, если путь поиска для qwindows.dll , который закодирован в вашем приложении, включает путь, где вы установили Qt. Рассмотрим следующий сценарий:
- я устанавливаю Qt на c:\Qt\.
- я разрабатываю приложение и правильно развертываю его в другом месте.
- он работает на любом компьютере правильно, потому что он включает qwindows.dll в подкаталог.
- я обновляю свой локальный Qt до новой версии.
- я пытаюсь запустить свое приложение снова.
Результатом является эта ошибка, потому что qwindows.dll в c:\Qt\. находится перед в его локальном каталоге и он несовместим с ним. Очень раздражать.
Решение состоит в том, чтобы поместить файл qt.conf в тот же каталог, что и ваш exe-файл. Я не знаю, как этого избежать. Если вы использовали инструмент windeployqt.exe для развертывания вашего приложения, поэтому у вас есть подкаталог с именем platforms , то этого достаточно:
Для людей, у которых эта проблема в будущем — у меня есть грязный маленький хак, работавший на меня. Попробуйте на свой страх и риск.
Выполните все шаги в начальном развертывании (быстрый и грязный) [http://wiki.qt.io/Deploy_an_Application_on_Windows]
- Закройте Qt Creator.
- скопируйте следующее в C:\Deployment\ версия выпуска MyApp.ехе все свои .dll файлы из C:\Qt\5.2.1\mingw48_32\bin\ все папки из C:\Qt\5.2.1\mingw48_32\plugins\
- (Если вы использовали QML) все папки из C:\Qt\5.2.1\mingw48_32\qml\ переименовать C:\Qt\ to C:\QtHidden\ (это превращает ваш компьютер в чистую среду, точно так же, как тот, на котором не установлен Qt).
- Запуск C:\Deployment\MyApp.exe.
Теперь для взлома —
- дублируйте папку для безопасности
- Если ваш файл был в/cat / Deployment, перейдите в /cat
- Теперь удалите папку развертывания в то время как .exe все еще работает. Он скажет вам, что не может этого сделать. удалить определенные файлы, так сказать пропустить(или пропустить все)
- то, что у вас осталось, — это список всех .dll файлы, которые ваши .exe на самом деле использовал и не мог удалить: список всех файлов и только те файлы, которые нужно сохранить.
Вы можете закрыть .теперь exe-файл. Чтобы проверить, нормально ли он развертывается, зайдите в папку, где вы его установили, и скажите: C:/Qt и переименовать его в C:/NotQt (в основном сделать Qt невидимым для системы). Если он работает сейчас, то будет развернут на других системах чаще всего-нет.
Ну, я решил свою проблему, хотя и не уверен, в чем разница:
Я скопировал каждую dll из моего каталога qt в оба ./ и ./ платформы каталога моих приложений.
Приложение прошло мимо ошибки, но затем разбилось.
Версия.dll вызывала сбой (отмечено в dependency walker), поэтому я удалил его из обоих мест.
Приложение запустилось, поэтому я систематически удалял все ненужные dll.
Это вернуло меня в то же состояние, в котором я был. первоначально.
Затем я удалил свое приложение и повторно установил (только с помощью ./ платформы / qwindows.dll файл остается), приложение работает правильно.
Таким образом, все, что я могу предположить, это то, что у меня была неправильная версия qwindows.DLL в каталог платформы.
У меня та же проблема.: 1. он может работать в VS2010; 2. он может работать в папке с файлами как: апп.exe \платформы\qwindows.файл DLL .
- Но он не смог загрузить qwindows на чистую машину с той же ОС, что и развивающаяся.
Решается простым перемещением папки платформы в плагины: апп.exe Плагины\платформы\qwindows.dll
Плюс: qwindows.DLL может быть переименован в любое вам нравится, как она запрашивается с помощью плагина interafce: qt_plugin_query_metadata ()
В нем отсутствуют qwindows.dll, которая обычно должна быть в платформах, если вы не добавляете:
Если вы этого не сделаете, кстати, и поставьте свои qwindows.dll где-то еще, Qt будет искать ваш путь для DLL, что может занять много времени (10s — несколько минут)!
Для меня, я должен был установить QT_QPA_PLATFORM_PLUGIN_PATH в каталог платформ, и тогда это сработало.
Как бы то ни было, это решение также было упомянуто на GitHub .
Попробовал все вышеперечисленное-оказалось, что для меня это было просто потому, что у меня не было основной библиотеки DLL Qt в папке apps