2013-05-30 118 views
4

我已經創建了一個DLL,它使用QTWebKit中的一些功能,然後通過JNA在java端訪問。在我的機器上(顯然安裝了QT),它工作正常。當我把它移動到另一臺機器去測試它沒有安裝qt時,我得到:QT平臺dll應該去哪裏?

無法加載平臺插件「windows」。可用的平臺是:

我的谷歌賦爲我指出這樣的事實,我需要還包括平臺的DLL,即qwindows.dllqminimal.dll。根據Deploying an Application on Windows中的QT5文檔,這聽起來像是在部署可執行文件時,它將位於保存目錄中名爲platforms的文件夾中作爲可執行文件。

與用戶插件相比,Qt插件必須放入與插件類型匹配的 子目錄中。由於我們要部署Windows平臺插件,因此必須將其放入「平臺」 子目錄中。

這使我陷入了困境。我有一個DLL,而不是一個可執行文件。所以我不知道在哪裏放置平臺文件夾。我試圖把它放在我正在執行我的測試應用程序的同一個目錄中,但那不起作用。

那麼我在哪裏放置平臺目錄以便QT能夠找到它?

編輯: 因爲我沒有太多的反饋,也許有字有更好的方式/處理這個問題。

如何告訴QT在哪裏可以找到平臺DLL?

似乎必須有一種方法來實現這一點。當我在機器上運行它時,它最終會在C:\Qt2\Qt5.0.2\5.0.2\msvc2012_64\plugins\platforms中查找。因此,似乎有中號

回答

4

我發現了兩種可能的解決方案,您需要在DLL或庫中創建一個QApplication(與創建具有exe的普通創建Qt應用程序基本上不同)。

  1. 最簡單的辦法是設置系統環境變量QT_QPA_PLATFORM到您所期望的platforms將位於該文件夾。我不喜歡這個解決方案,因爲擔心它可能會干擾安裝在終端系統上的其他應用程序。

  2. 下一個解決方案是利用正常QT應用程序將使用的命令行參數。在一個正常的Qt應用程序QApplication將在主相似創建於:

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

    那麼我們反正在這一點上,以創建argvargc所以用它來我們的優勢。

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

注意:即使是現在google搜索-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

訣竅是我正在運行一個調用到dll的java應用程序。很明顯,'QApplication'實例認爲'applicationDirPath()'是我的Java版本的bin目錄。不是java認爲是我的工作目錄。我嘗試在'QApplication'中使用'addLibraryPath()'將其設置爲已知的已知目錄,並將它們放在那裏。但我仍然得到上面的同樣的錯誤。感謝您的幫助和鏈接,但肯定是很好的信息。 –

+0

您是否查詢過Java的工作目錄和應用程序目錄?你可以在那裏安裝你的Qt dll嗎? – phyatt

+0

也有你成功地加載和運行的Java之外的DLL,就像只是一個C + +的例子? – phyatt

0

QGuiApplication::QGuiApplication的文檔描述了支持的命令行參數和相應的環境變量(如果有的話)。這是值得參考的。

和@jschoen,這也是你需要的鏈接。

ps。我的聲望小於50,所以我不能評論@jschoen

+0

我想他們必須在某個地方!感謝您的鏈接。 –

+0

@jschoen btw。另一種方法是覆蓋['qt.conf'](http://doc.qt.io/qt-5/qt-conf.html#overriding-paths)中的'插件',該方法節省了用於指定命令行參數或環境變量 – uwydoc