Deploying Plugins

本篇介绍如何部署 Qt 或应用程序的插件库, 以便在运行时加载. 如果你使用 静态插件, 则插件代码已经是应用程序可执行文件的一部分, 不需要单独的部署步骤.

The Plugin Directory

在 Qt 中, 当应用程序启动时, 应用程序的可执行目录是 Qt 搜索插件的基本目录. 例如, 在 Windows 上, 如果应用程序位于 C:\Program Files\MyApp, 且它具有样式插件, Qt 会在 C:\Program Files\MyApp\styles 目录查找插件. (如何查找应用程序的可执行文件目录, 参见 QCoreApplication::applicationDirPath().) Qt 还会查找 QLibraryInfo::location(QLibraryInfo::PluginsPath) 指定的目录, 这个目录通常位于 QTDIR/plugins ( QTDIR 是 Qt 的安装目录). 如果你希望 Qt 查找其他位置, 你可以调用 QCoreApplication::addLibraryPath() 添加所需路径. 如果你想设置自己的路径, 你可以调用 QCoreApplication::setLibraryPaths(). 或者, 你也可以使用 qt.conf 文件, 覆盖编译到 Qt 库中的硬编码路径. 详见 Using qt.conf. 另一种方法是, 在运行应用程序前, 设置 QT_PLUGIN_PATH 环境变量, 可以使用系统路径分隔符分隔多个路径. 设置后, Qt 将在此变量中指定的路径中查找插件.

注意: 不要将 QT_PLUGIN_PATH 导出到系统范围的环境变量, 因为它可能干扰 Qt 的其他版本安装.

Loading and Verifying Plugins Dynamically

加载插件时, Qt 库会进行一些健全性检查, 以确定插件是否可以加载和使用. 这种健全性检查使你能够并行安装多个 Qt 版本和配置.

以下规则适用:

  • 低版本的库不会加载高版本库链接的插件.


    例如: Qt 5.0.0 不会加载使用 Qt 5.0.1 构建的插件.

  • 高的主版本号的库不会加载低的主版本库链接的插件.


    例如: Qt 5.0.1 不会加载使用 Qt 4.8.2 构建的插件.
    例如: Qt 5.1.1 将加载使用 Qt 5.1.0 和 Qt 5.0.3 构建的插件.

在构建插件来扩展应用程序时, 确保插件的配置方式与应用程序的配置方式相同非常重要. 这意味着如果应用程序是在发布模式下构建的, 那么插件也应该在发布模式下构建. 除了 Unix 操作系统外, 插件系统不会加载与应用程序不同模式构建的插件.

如果你将 Qt 配置为在调试和发布模式下构建, 但仅在发布模式下构建应用程序, 则需要确保你的插件也是在发布模式下构建. 默认情况下, 如果 Qt 的调试版本可用, 则插件将仅在调试模式下构建. 要强制插件在发布模式下构建, 请将以下行添加到插件的 .pro 文件中:

  CONFIG += release

这可确保插件与应用程序中使用的库版本兼容.

Debugging Plugins

应用程序与插件一起配合使用可能出现很多问题. 大多数与插件和应用程序构建方式的差异有关, 通常由单独的构建系统和流程引起.

使用QT_DEBUG_PLUGINS环境变量, 获取 Qt 尝试加载每个插件时的诊断信息. 在启动应用程序的环境中将变量设置为非零值.

下表描述了开发人员在创建插件时遇到问题的常见原因以及可能的解决方案:

ProblemCauseSolution
Plugins sliently fail to load even when opened directly by the application. Qt Designer shows the plugin libraries in its Help|About Plugins dialog, but no plugins are listed under each of them.The application and its plugins are built in different modes.Either share the same build information or build the plugins in both debug and release modes by appending the debug_and_release to the CONFIG variable in each of their project files.