如果其他宏删除了Q_OBJECT宏,则无法编译MOC文件:头文件不包含<qobject> </qobject>

时间:2012-04-29 17:53:19

标签: c++ qt c-preprocessor moc

编译Qt / C ++程序的非Qt版本(-DDISABLE_MYMODULE)时,我收到此编译器错误:

src/mymodule.moc.cpp:12:2: error: #error "The header file
'mymodule.hpp' doesn't include <QObject>."
src/mymodule.moc.cpp:19:1: error: ‘QT_BEGIN_MOC_NAMESPACE’ does not name a type
src/mymodule.moc.cpp:40:6: error: ‘MyModule’ has not been declared
...

我正在使用GNU make(而不是qmake)。我的Makefile每个模块编译两个目标文件,一个直接来自.cpp源文件,另一个来自.moc.cpp源文件的MOC目标文件(这是不起作用的),都使用g ++。此.moc.cpp源文件由MOC从.hpp标头创建(此过程不会引发错误)。

有问题的头文件看起来有点像这样:

#ifndef DISABLE_MYMODULE //My problem macro
#ifndef MYMODULE_HPP
#define MYMODULE_HPP
//...
class MyModule : //...
{
    Q_OBJECT //Qt problem macro
    //...
};
//...
#endif
#endif

如果不设置我的问题宏,整个事情将编译(以及稍后链接,执行)就好了。如果我设置它,但注释掉QT的问题宏,那么它也可以正常编译(构建一个非Qt版本)。

我不确切知道,MOC取代了Q_OBJECT,但它不应该仍然在我的DISABLE_MYMODULE中,因此被预处理器删除了吗?

2 个答案:

答案 0 :(得分:3)

您的宏DISABLE_MYMODULE看起来像是排除了类定义,其中包括Q_OBJECT。另一方面,此代码仍由moc工具处理,该工具生成mymodule.moc.cpp文件,该文件又包含mymodule.hpp头文件。当mymodule.moc.cpp随后被编译器处理时,它包含.hpp文件,但由于DISABLE_MYMODULE,预处理器会排除其内容,因此编译器找不到类的定义,#include&lt; QObject&gt;和Q_OBJECT宏应该扩展的东西。因此,编译器找不到它预期会发生的事情并且会让人心烦意乱......

我认为,如果定义了DISABLE_MYMODULE,或者(更好)禁用mymodule.hpp上的moc处理,如果定义了DISABLE_MYMODULE,解决方法是从构建中排除mymodule.moc.cpp。

答案 1 :(得分:-1)

尝试检查下一个标准:

  1. 类应该直接或间接地从QObject继承,并且QObject必须是继承列表中的第一个。
  2. 类在单独的* .h和* .cpp文件中定义和实现。如果没有,则需要将#include“you_cpp_file.moc”添加到实现和定义类的文件的末尾。