gpt4 book ai didi

c++ - 如果 Q_OBJECT 宏被其他宏 : The header file doesn't include 删除,则无法编译 MOC 文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:55:34 30 4
gpt4 key购买 nike

当编译 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 header 创建(此过程不会引发错误)。

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

#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 中,因此被预处理器删除吗?

最佳答案

看起来您的宏 DISABLE_MYMODULE 排除了类定义,其中包括 Q_OBJECT。另一方面,此代码仍由 moc 工具处理,该工具生成您的 mymodule.moc.cpp 文件,该文件又包含您的 mymodule.hpp 头文件。当编译器处理 mymodule.moc.cpp 时,它包含 .hpp 文件,但由于 DISABLE_MYMODULE,预处理器排除了它的内容,因此编译器找不到类的定义,#include 和 Q_OBJECT 宏应该扩展到的东西.所以编译器没有找到它期望的东西并变得不安......

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

关于c++ - 如果 Q_OBJECT 宏被其他宏 : The header file doesn't include <QObject> 删除,则无法编译 MOC 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10374476/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com