2015-11-11 3 views
2

Когда я запускаю свое приложение на другом компьютере, и если я переименую каталог Qt, я получаю сообщение «Это приложение не запускалось, потому что оно не могло найти или загрузить плагин платформы Qt». Переустановка приложения может решить проблему." Вот макет папки, держащего приложения:Qwindows.dll никогда не был найден

app.exe 
icudt53.dll 
icuin53.dll 
icuuc53.dll 
Qt5Core.dll 
Qt5Gui.dll 
Qt5Widgets.dll 
msvcp110.dll 
platforms/qwindows.dll 

Есть ли возможность заставить искать qwindows.dll для директории моего приложения вместо каталога QT?

+0

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

ответ

1

использование windeployqt:

перейдите в папку установки интервала QT, что-то вроде этого: C:\QT\5.5\msvc2013\bin есть .exe находится здесь называется windeployqt начать ЦМД отсюда. (Ctrl + Shift + RightClick). Затем введите следующее: windeploy [full path to your release map]

1

Я решил проблему, установив путь в коде.

TCHAR path[_MAX_PATH+1]; 
GetModuleFileName(GetModuleHandle("myApp.dll"),path,sizeof(path)/sizeof(path[0])); 
std::string runningFolder = ExtractFileDir(path); 
QStringList paths; 
paths.append(runningFolder.c_str()); 
QCoreApplication::setLibraryPaths(paths); 
app = static_cast <QApplication *> (QApplication::instance()); 
     if (app == NULL) 
     { 
      int argc = 0; 
      app = new QApplication(argc, NULL); 
     } 
1

Каталог установки Qt не должен находиться в вашей среде PATH. Тогда переименование Qt dir не требуется (в отличие от OSX). Во время разработки вы можете запускать свое приложение из Qt Creator.

Если вы запустите приложение вне Qt Creator, например, дважды щелкнув по нему в проводнике, Windows также автоматически включит в свой путь поиска приложение dir, и на самом деле это первое место, где он будет выглядеть. Если он не может найти там DLL, или если это неправильная версия (например, 32/64 бит), она попытается найти ее где-то в другом месте. Нет необходимости устанавливать или загружать пути библиотеки. Используйте хост зависимостей, чтобы узнать, какие DLL вам нужны. Скопируйте их из дистрибутива Qt Install или извлеките их из EXC-версии Microsoft vc-redistributable в случае необходимости dll msvc (я думаю, что вам не хватает dll msvcr). Все это копирование dll должно быть выполнено с помощью скрипта qmake. Какой плагин Qt dll нужен вашему приложению, это вопрос проб и ошибок. Для некоторых отсутствующих плагинов dll ОС выдает предупреждение при запуске приложения.

Вы можете следовать совету Пим, используя windeployqt. Мы предпочитаем контролировать себя, какие DLL будут развернуты.

Ваше местонахождение платформ плагинов qwindows.dll является абсолютно правильным. Приложение не загружает dll плагина, но загружает dll dll плагинов dll, и эти Qt dll знают точно, где их ожидать и найти. Единственная причина, по которой я могу представить, что у вас проблемы, заключается в том, что ваше приложение загружает неправильную dll Qt и что dll не может найти dll-платформы. Не забывайте, что многие другие многоплатформенные приложения также используют Qt. Они могли бы сбрасывать Qt dll в каталоге system32, иначе они могли бы выставить их, добавив их в каталог PATH. Добро пожаловать в ад.

Существует простой подход к борьбе с dll hell: удалите (и восстановите) из своего приложения dir dll по одному и каждый раз дважды щелкните свое приложение. Если Windows не жалуется на отсутствие именно этой DLL, вы просто удалили, что dll не была правильной версией. Если это все равно не поможет, вы, вероятно, пропустили другую Qt-dll, используемую вашим приложением.

+0

Ваше утверждение относительно PATH неверно. Если вы не используете файл qt.conf, Qt попытается найти DLL-файлы в каталоге установки (hardcoded path to) Qt, даже если он не установлен в PATH. Затем он также загружает qwindows.dll, даже если вы развернули его копию вместе с вашим приложением. – Andre