在编译非 Qt 版本的 Qt/C++ 程序 (-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 源文件(这是行不通的),两者都使用 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 内,因此被预处理器删除吗?