4

我创建了一个使用 QTWebKit 的一些功能的 DLL,然后我通过 Java 端的 JNA 访问它。在我的机器上(显然安装了 QT)它工作正常。当我将它移动到另一台没有安装 qt 的机器上进行测试时,我得到:

无法加载平台插件“windows”。可用平台有:

我的 google fu 指出我还需要包含平台 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. 所以似乎有m

4

2 回答 2

4

对于需要在 DLL 或库中创建的场景,我找到了两种可能的解决方案QApplication(与具有 exe 的普通创建 Qt 应用程序基本不同)。

  1. 最简单的解决方案是将系统环境变量设置为QT_QPA_PLATFORM您希望platforms位于的文件夹。我不喜欢这个解决方案,因为担心它会干扰安装在终端系统上的其他应用程序。

  2. 下一个解决方案是利用普通 QT 应用程序将使用的命令行参数。在一个普通的 Qt 应用程序QApplication中,将在您的 main 中创建类似于:

    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);
    

注意:即使现在谷歌搜索-platformpluginpath我也找不到任何信息。或者关于 QT 可以使用哪些其他命令行参数的信息。我是通过在寻找解决方案时挖掘 QT 源代码找到的。因此,如果有人碰巧拥有指向包含该信息的资源的链接,那么留下评论会很方便。

于 2013-05-31T17:55:04.077 回答
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

希望有帮助。祝你好运。

于 2013-05-30T20:39:11.093 回答