将 Qt 4.8 转换为 5 QPluginLoader->instance 返回 null

Posted

技术标签:

【中文标题】将 Qt 4.8 转换为 5 QPluginLoader->instance 返回 null【英文标题】:Converting Qt 4.8 to 5 QPluginLoader->instance returns null 【发布时间】:2013-01-21 05:17:10 【问题描述】:

我使用 QT 4.8.2 编写了一个应用程序。它确实动态加载不同的插件以为用户提供多种功能。 现在 Qt5 发布了,我想将我的项目转换为最新版本。

除了使用 QPluginLoader->instance() 加载插件外,我一切正常。在使用 Qt 4.8.2 时,它运行良好。

->errorString 说: “文件‘.../plugins/nlprod.dll’不是一个有效的Qt插件。”

这是我的代码:

插件加载器.cpp:

//"fileName" contains the name of the .dll
pluginLoader->setFileName(pluginsDir->absoluteFilePath(fileName));

//"a" contains the correct path + name of the .dll
QString a = pluginLoader->fileName();      

//"plugin" is null and success "false"
QObject *plugin = pluginLoader->instance();
bool success = pluginLoader->isLoaded();

MyPlugin.h:

class NLPro : public QObject, IConnection

    Q_OBJECT
    Q_PLUGIN_METADATA(IID "NLPro" FILE "nlpro.json") // <- New since I've ported to Qt 5
    Q_INTERFACES(IConnection)
...

我的插件.cpp: 我已删除以下内容:

Q_EXPORT_PLUGIN2(NLPro, NLPro);

我添加了一个包含以下内容的 .json 文件:

 "Keys": [ "NLPro"] 

【问题讨论】:

请记住,您使用 Qt 4 编译的插件与 Qt 5 兼容。它们取决于版本。使用 Qt 5 编译插件是您唯一的选择。 【参考方案1】:

OP 的解决方案。

已修复:

虽然

TARGET = $$qtLibraryTarget(nlpro)

在 Qt 4.8 中正常工作,我不得不将其更改为

TARGET = $$qtLibraryTarget(NLPro)

对于 Qt 5.0

【讨论】:

以上是关于将 Qt 4.8 转换为 5 QPluginLoader->instance 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Windows 上的 Qt 5.1.0 使用 minGW 4.8 需要很长时间才能调试

如何在VS2012下静态构建Qt 4.8/5.2,使用静态MSVC运行时,支持Windows XP?

Qt 4.8,Visual Studio 2013 编译错误

Qt5 和 Qt 4.8 中的模型和角色

我是win7 64位的系统,下载了Qt 5.2.1 for Windows 32-bit (MinGW 4.8, OpenGL, 634 MB)请安装过的大神

从 Visual Studio 2012 中浏览 Qt 5.1.1 基本源 - 将 .pro 转换为 .sln 文件