为什么在Qt cpp源代码中为.moc文件添加一个include很重要?
这是几个Qt样本中常用的步骤,包括以下步骤:
http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html;文件末尾应包含#include“testqstring.moc”行。
我不明白为什么这是必要的。
谢谢。
最佳答案
如果在QObject
文件中使用Q_OBJECT
宏定义.cpp
子类,则很有必要。 这样做时:
qmake
必须在Makefile
内部生成规则,以在该moc
文件上调用.cpp
。这种特殊的(hackish?)包含会触发
qmake
这样做,并告诉它在moc
上调用时将是teststring.moc
的输出文件(.cpp
)。 moc
的输出(仍然是一堆C++代码),编译器必须查看您的类定义。否则,它会提示说没有YourClass::staticMetaObject
之类的东西,因为它不知道YourClass
存在。通常,在头文件中定义具有
Q_OBJECT
的类。然后moc
将#include "header.h"
添加到其生成的输出中,这意味着moc
的输出可以被愉快地编译。但是,如果您的类定义在
.cpp
中怎么办?您不能在#include
的输出中对.cpp
文件进行moc
编码,因为那样会给您带来大量的重新定义错误。相反,您可以在
#include
中输出moc
.cpp
的输出,以便将其一起编译,并且每个人都很高兴。 (这意味着qmake
将只发出一条说运行moc
的规则,而不会发出另一条告诉编译器编译moc
的输出的规则。)从2.开始,您还可以认为在
Q_OBJECT
中使用.h
定义类不需要任何特殊的包含。