2013-05-30 3 views
4

Я создал DLL, которая использует некоторые функции из QTWebKit, которые затем я получаю через JNA на стороне java. На моей машине (на которой QT установлен явно) она работает нормально. Когда я переношу его на другую машину, чтобы проверить его, у которого нет qt, я получаю:Куда делятся плагины платформы QT?

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

Мой Google-фу, как указал мне на то, что мне нужно также включать в себя библиотеки DLL платформы, а именно qwindows.dll и qminimal.dll. Согласно документации QT5 в Deploying an Application on Windows, похоже, что при развертывании исполняемого файла она будет находиться в папке с именем platforms в каталоге сохранения в качестве исполняемого файла.

В отличие от пользовательских плагинов, плагины Qt должны быть помещены в подкаталоги , соответствующие типу плагина. Поскольку мы хотим развернуть плагин платформы Windows , его необходимо поместить в подкаталог «платформ» .

Это приводит меня к моей дилемме. У меня есть dll, а не исполняемый файл. Поэтому я не знаю, где разместить папку с платформой. Я попытался поместить его в тот же каталог, в котором выполняю свое тестовое приложение, но это не сработало.

Итак, где разместить каталог платформы, чтобы QT мог его найти?

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

Как узнать QT, где найти DLL-платформы?

Похоже, что для этого должен быть способ. Когда я запускаю его на своей машине, он заканчивает поиск в C:\Qt2\Qt5.0.2\5.0.2\msvc2012_64\plugins\platforms. Так кажется, что м

ответ

4

Я нашел два возможных решения для сценария, которые вам необходимы для создания QApplication внутри библиотеки DLL или библиотеки (в основном отличной от обычного приложения Qt, имеющего exe).

  1. Самым простым решением является создание среды системной переменной QT_QPA_PLATFORM в папку, которую вы ожидать, что platforms быть расположен в. Мне не понравилось это решение, опасаясь, что оно может помешать другим приложениям, установленным на конечной системе.

  2. Следующее решение - использовать параметры командной строки, которые будет использовать обычное приложение QT. В нормальном Qt приложения QApplication будет создан в вашей основной аналогичен:

    int main(int argc, char *argv[]) { 
        QApplication app(argc, argv); 
    
        //other code 
    
        return app.exec(); 
    } 
    

    Ну мы должны создать argv и argc в любом случае в этой точке, так что используйте, что в наших интересах.

    char *argv[] = {"YourAppName","-platformpluginpath", "C:/your/path/to/dll/folder", NULL}; 
    int argc = sizeof(argv)/sizeof(char*) - 1; 
    
    QApplication app(argc, argv); 
    

ПРИМЕЧАНИЕ: Даже сейчас прибегая к помощи -platformpluginpath я не мог найти для него информацию. Или информация о том, какие другие параметры командной строки могут быть доступны для использования с QT. Я нашел его, копаясь в исходном коде QT, ища решение. Поэтому, если у кого-то есть ссылка на ресурс с этой информацией, было бы удобно оставить комментарий с ним.

+0

Я думаю, что QT_QPA_PLATFORM в вашем решении (1) должно быть QT_QPA_PLATFORM_PLUGIN_PATH (http://qt-project.org/forums/viewthread/22908) –

3

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx#standard_search_order_for_desktop_applications

Когда вы запускаете вашу программу в Qt, она настраивает переменные окружения, чтобы добавить некоторые вещи на вашем пути.

По умолчанию «путь», который ваша DLL знает о запуске, зависит от exe, который загружает его, и его рабочего каталога, его каталога приложений и т. Д. Если вы тестируете программу, загружающую вашу DLL, в той же папке, что и dll, вам, вероятно, просто нужно положить qwindows.dll в «./platforms/».

Вы должны также проверить в эту функцию:

http://qt-project.org/doc/qt-4.8/qcoreapplication.html#setLibraryPaths

http://qt-project.org/doc/qt-4.8/qcoreapplication.html#libraryPaths

Надежда, что помогает. Удачи.

+0

Хитрость в том, что я запускаю приложение java, которое вызывает в dll. По-видимому, экземпляр 'QApplication' считает, что' applicationDirPath() 'является каталогом bin для моей версии java. Не то, что java считает моей рабочей директорией. Я попытался использовать 'addLibraryPath()' в 'QApplication', чтобы установить его в известную известную директорию и разместить там. Но я все еще получаю ту же ошибку выше. Спасибо за помощь и ссылки, хотя, хорошая информация наверняка. –

+0

Вы запросили рабочий каталог Java и каталог приложений? Можете ли вы установить там Qt-dll? – phyatt

+0

Также вы успешно загрузили и запустили dll за пределами java, например, с помощью только примера C++? – phyatt

0

документация для QGuiApplication::QGuiApplication описывает поддерживаемые аргументы командной строки и соответствующие переменные среды (если они есть). это заслуживает упоминания.

и @jschoen, это также ссылка, в которой вы нуждаетесь.

пс. моя репутация меньше 50, поэтому я не могу комментировать @jschoen

+0

Я решил, что они должны быть где-то! Спасибо за ссылку. –

+0

@jschoen кстати. Другой альтернативой является переопределение «плагинов» в ['qt.conf'] (http://doc.qt.io/qt-5/qt-conf.html#overriding-paths), этот метод сэкономит усилия для указания аргументы командной строки или переменные среды – uwydoc

Смежные вопросы