2013-07-06 47 views
3

我决定将我的爱好项目应用程序(字典查找程序)切换到插件体系结构,以便将来为其他语言开发各种不同的字典。该应用程序是使用Qt(5.0.2)在Visual C++中开发的。我加入这个头应用程序代码来定义词典插件接口:构建插件以扩展Qt应用程序

// dict_plugin.h 
#ifndef DICT_PLUGIN_H 
#define DICT_PLUGIN_H 

#include <QtPlugin> 

class PluginInterface 
{ 
public: 
    virtual ~PluginInterface() {} 

    virtual QString language() const = 0; 
    virtual class QWidget* ui() const = 0; 
}; 

Q_DECLARE_INTERFACE(PluginInterface, "pl.ksmvision.winona.PluginInterface") 

#endif // DICT_PLUGIN_H 

接下来,我创建了从插件本身的“Qt库”模板创建一个新的项目(使用Qt Visual Studio中添加 - 在)这是用来制作DLL的。主头文件看起来是这样的:

#ifndef JP_PLUGIN_H 
#define JP_PLUGIN_H 

// created by the template to define Q_DECL_EXPORT 
// and _IMPORT macros but the plugin engine takes 
// care of that (I think) 
//#include "jp_plugin_global.h" 

#include <QObject> 
#include <QtPlugin> 

#include <dict_plugin.h> 

class JpPlugin : public QObject, public PluginInterface 
{ 
    Q_OBJECT 
    Q_PLUGIN_METADATA(IID "pl.ksmvision.winona.JpPlugin") 
    Q_INTERFACES(PluginInterface) 

public: 
    JpPlugin(); 
    virtual ~JpPlugin(); 

    virtual QString language() const; 
    virtual QWidget* ui() const; 
}; 

#endif // JP_PLUGIN_H 

当我尝试建立这个,我得到的Q_INTERFACES行指定接口MOC错误我的插件是应该执行:

3 > ------建立开始:项目:jp_plugin,配置:调试Win32 ------
3> Moc'ing jp_plugin.h ...
3> F:\ moje \ src \ cpp \ winona \ build \ jp_plugin \ jp_plugin.h(15):error:Undefined interface
========== Build:2成功,1次失败,2次达成数据E,0已跳过==========

它看起来像moc'ing发生包含在dict_plugin.h文件之前,因为当我介绍一个错字到包括文件名,它不没有抱怨文件不存在,只是通过关于未定义的接口的相同错误消息来终止构建。

我在做什么错?谢谢。

+0

不应该是'#include“dict_plugin.h”'? '<>'标题是系统标题。 ''“'包含自己的头文件。 – MSalters

+0

不,因为dict_plugin头文件属于应用程序,并且所有插件都将其作为外部头文件包含它们,而不是它们自己的。另外,我不认为预处理器现在总是有一些该死的,“”和“>”似乎对所有头文件都完全相同。 – neuviemeporte

+0

你错过了这一点。 MOC也需要包含标题,* IT *跳过标题。不是编译器的预处理器。 – MSalters

回答

5

moc失败的原因是因为接口声明不可用。 #include指令失败,因为无法找到文件。显然,moc可以自己处理#include指令,但是不会(默认情况下)打印错误消息或停止处理,如果找不到要包含的文件。

原因与接口声明的头文件不能被发现的是,自定义生成由Qt的VS插件产生不继承该项目的include路径设置,这导致MOC被调用。我设法通过输入插件头文件的属性页面,浏览到Custom Build Tool-> General-> Command Line,并在其中添加一个额外的“-I ...”include选项,从而将必需的路径添加到moc的命令行中结束。之后,moc处理标题并且构建成功。

+0

同样的错误,同样的问题。谢谢! – Tobias

+0

...并帮助我今天修复它:-)谢谢! – Arun

+0

在我的情况下,moc没有看到通过<>连接的文件。包括“......”在内的替代解决了这个问题 – Francuz