编译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中,因此被预处理器删除了吗?
答案 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)
尝试检查下一个标准: