• 5741阅读
  • 2回复

[提问]自定义宏嵌套Q_INTERFACES编译出来的插件无法加载? [复制链接]

上一主题 下一主题
离线zhlgh603
 

只看楼主 倒序阅读 楼主  发表于: 2016-07-20
1.原因:
原有项目使用Qt4.8开发,并使用Qt插件框架
现项目要迁移到Qt5,Qt5中插件定义使用的宏与Qt4中的不一致

2.想法:
使用自定义宏根据Qt版本调用对应的Qt插件宏定义

3.实现:
#   ifdef Qt4
#       define  MY_INTERFACES(x) Q_INTERFACES(x)

#       define  MY_EXPORT_PLUGIN(PLUGIN, PLUGINCLASS) \
            Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS)


#   endif

#   ifdef Qt5
#       define  MY_EXPORT_PLUGIN(PLUGIN, PLUGINCLASS) \

#       define  MY_INTERFACES(x) \
            Q_INTERFACES(x) \
            Q_PLUGIN_METADATA(IID MODULENAME FILE MODULENAME_FILENAME)
#   endif


class CONFIG_EXPORT AppconfigManager : public QObject , PluginInterface
{
    Q_OBJECT
    MY_INTERFACES(PluginInterface)
public:
    AppconfigManager() {}
    ~AppconfigManager() {}

//...省略PluginInterface接口的实现
}

其中在.pro中定义MODULENAME和生成MODULENAME_FILENAME
DEFINES += MODULENAME=\\\"$$TARGET\\\"
DEFINES += MODULENAME_FILENAME=\\\"$${TARGET}.json\\\"
MODULENAME = $$TARGET
MODULENAME_FILENAME = $${TARGET}.json
#生成插件文件
PLUGIN_METADATA = $$MOUDLE_FILENAME
PLUGIN_METADATA_FILENAME = $$_PRO_FILE_PWD_/$$PLUGIN_METADATA
!exists($$PLUGIN_METADATA_FILENAME) {
    system(echo \{\} >$$PLUGIN_METADATA_FILENAME)
}
OTHER_FILES += $$PLUGIN_METADATA_FILENAME

4.问题:
编译提示:appconfigmanager.h:20: Warning: Class AppconfigManager implements the interface PluginInterface but does not list it in Q_INTERFACES. qobject_cast to PluginInterface will not work!
运行时使用QPluginLoader加载该插件

    QPluginLoader loader(filePath);
    QObject *plugin = loader.instance();

plugin为零!

求指导!求指导!求指导!


离线zhlgh603

只看该作者 1楼 发表于: 2016-07-20
qt484\src\tools\moc\preprocessor.cpp
void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed)
{
......
         case PP_DEFINE:                 <<-------------------------------------这里没看出有处理宏嵌套
        {
            next(IDENTIFIER);
            QByteArray name = lexem();
            int start = index;
            until(PP_NEWLINE);
            Macro macro;
            macro.symbols.reserve(index - start - 1);
            for (int i = start; i < index - 1; ++i)
                macro.symbols += symbols.at(i);
            macros.insert(name, macro);
            continue;
        }
        case PP_UNDEF: {
            next(IDENTIFIER);
            QByteArray name = lexem();
            until(PP_NEWLINE);
            macros.remove(name);
            continue;
        }
        case PP_IDENTIFIER:
        {
//             if (macros.contains(symbol()))
//                 ;
        }
            // we _could_ easily substitute macros by the following
            // four lines, but we choose not to.                                          <<--------------------------------汗,不处理
            /*
            if (macros.contains(sym.lexem())) {
                preprocessed += substitute(macros, symbols, i);
                continue;
            }
            */
            break;
......
}

估计没戏了
要另想办法
离线never_forget

只看该作者 2楼 发表于: 2016-07-22
虽然看不懂,但是好厉害!
快速回复
限100 字节
 
上一个 下一个