【问题标题】:Where are QT platform dlls supposed to go?QT 平台 dll 应该去哪里?
【发布时间】:2013-05-30 18:21:30
【问题描述】:

我创建了一个 DLL,它使用 QTWebKit 的一些功能,然后我通过 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

【问题讨论】:

    标签: qt dll qt5


    【解决方案1】:

    对于需要在 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 源代码找到的。因此,如果有人碰巧有指向包含该信息的资源的链接,那么留下评论会很方便。

    【讨论】:

    【解决方案2】:

    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

    希望对您有所帮助。祝你好运。

    【讨论】:

    • 诀窍是我正在运行一个调用 dll 的 java 应用程序。显然QApplication 实例认为applicationDirPath() 是我的java 版本的bin 目录。不是java认为是我的工作目录。我尝试在QApplication 中使用addLibraryPath() 将其设置为已知的已知目录,并将它们放在那里。但我仍然得到上面同样的错误。不过感谢您的帮助和链接,肯定是很好的信息。
    • 你查询过Java的工作目录和应用目录吗?你能在那里安装你的 Qt dll 吗?
    • 您是否也成功地在 java 之外加载并运行了 dll,就像使用 c++ 示例一样?
    • 抱歉错过了您的 cmets。对我来说奇怪的是,Java 的工作是我项目的根目录(我使用的是 eclipse),但应用程序 dir 路径是 java 安装的 bin 目录。将 dll 放在 java 工作目录中似乎不起作用。将它们放在 java 安装的 bin 目录中确实有效,但这对于部署来说并不可行。我试过addLibraryPathsetLibraryPaths 没有成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2020-06-08
    • 2012-10-09
    • 1970-01-01
    相关资源
    最近更新 更多