Q_OBJECT链接器错误!

lia*_*iaK 12 c++ qt qt4 linker-errors qobject

我在构建应用程序时收到以下链接器错误.

HIMyClass.obj :: error:未解析的外部符号"public:virtual struct QMetaObject const*__thiscall CHIMyClass :: metaObject(void)const"(?metaObject @ CHIMyClass @@ UBEPBUQMetaObject @@ XZ)找不到文件:HIMyClass.obj

HIMyClass.obj :: error:未解析的外部符号"public:virtual void*__thiscall CHIMyClass :: qt_metacast(char const*)"(?qt_metacast @ CHIMyClass @@ UAEPAXPBD @ Z)找不到文件:HIMyClass.obj

HIMyClass.obj :: error:未解析的外部符号"public:virtual int __thiscall CHIMyClass :: qt_metacall(enum QMetaObject :: Call,int,void**)"(?qt_metacall @ CHIMyClass @@ UAEHW4Call @ QMetaObject @@ HPAPAX @ Z)找不到档案:HIMyClass.obj

我的班级声明就像

class CHIMyClass:public QDialog
{
   Q_OBJECT

   ....

};
Run Code Online (Sandbox Code Playgroud)

当我评论Q_OBJECT时,链接器错误消失(显然我无法使用信号和插槽).我使用Qt Creator作为IDE和Qt 4.5.3.当我给Rebuild All时,肯定会调用QMake.我想,它产生的moc_*文件就是问题所在.我使用Windows XP和cl作为编译器.

这个链接器错误背后的原因可能是什么?

cha*_*lup 28

此类错误通常意味着您没有将类的标题添加到pro文件中的"HEADERS"变量(元对象编译器仅为此变量中列出的标题生成moc_文件).记得在更改.pro文件后运行qmake!

  • 这不是未定义的.实际上,它非常具有确定性:1.创建一个扩展QObject但忘记添加Q_OBJECT的类.2. qmake 3. make 4.将Q_OBJECT添加到类中.5.制作6.同样的错误.7. qmake 8. make 9.不再有错误.Qmake只会向HEADERS中的那些文件添加一个'moc'规则,该文件的某个类具有Q_OBJECT宏. (6认同)
  • 手动删除qmake生成的所有文件和所有目标文件,然后重新运行qmake. (2认同)

sak*_*isk 12

我有一个类似的问题,它是使用andref的反馈解决的.在QT Creator中我简单地说:

  1. 建立/清洁所有
  2. 构建/运行qmake
  3. 构建/运行