为什么在 Qt 源代码文件末尾包含“.moc”文件很重要?
Why is important to include ".moc" file at end of a Qt Source code file?
为什么在 Qt cpp 源代码中添加 .moc 文件的包含很重要?
这是几个 Qt 示例中使用的常见步骤,包括这个:
http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html; 其中 #include "testqstring.moc"
行应包含在文件末尾。
我不明白为什么这是必要的。
如果在.cpp
文件中用Q_OBJECT
宏定义QObject
子class是必须的。当你这样做:
qmake
必须在您的 Makefile
中生成规则才能在该 .cpp
文件上调用 moc
。
那个特殊的(骇人听闻的?)包含触发 qmake
这样做,并告诉它当在您的 .cpp
。
为了编译 moc
的输出(仍然是一堆 C++ 代码),编译器必须看到您的 class 定义。 否则,它会抱怨没有 YourClass::staticMetaObject
之类的东西,因为它不知道 YourClass
存在。
通常在头文件中定义 classes,其中包含 Q_OBJECT
。 moc
然后在其生成的输出中添加一个 #include "header.h"
,这意味着 moc
的输出可以愉快地编译。
但是如果您的 class 定义在 .cpp
中怎么办?您不能在 moc
的输出中 #include
一个 .cpp
文件,因为那样会给您大量的重定义错误。
相反,您 #include
moc
的输出在您的 .cpp
中,以便它被编译在一起,每个人都很高兴。 (这意味着 qmake
只会发出一个规则说 运行 moc
,而不是告诉编译器编译 moc
的输出的另一条规则。)
从 2. 你也可以假设在 .h
中用 Q_OBJECT
定义 classes 不需要任何特殊包含。
补充一下:
当xxx.h中有Q_OBJECT
时,qmake
后,系统会生成一个moc_xxx.cpp
,里面有xxx.h。
当Q_OBJECT
在xxx.cpp,qmake
之后,系统会生成一个xxx.moc
,需要在.cpp文件中加入.moc文件.
为什么在 Qt cpp 源代码中添加 .moc 文件的包含很重要?
这是几个 Qt 示例中使用的常见步骤,包括这个:
http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html; 其中 #include "testqstring.moc"
行应包含在文件末尾。
我不明白为什么这是必要的。
如果在.cpp
文件中用Q_OBJECT
宏定义QObject
子class是必须的。当你这样做:
qmake
必须在您的Makefile
中生成规则才能在该.cpp
文件上调用moc
。那个特殊的(骇人听闻的?)包含触发
qmake
这样做,并告诉它当在您的.cpp
。为了编译
moc
的输出(仍然是一堆 C++ 代码),编译器必须看到您的 class 定义。 否则,它会抱怨没有YourClass::staticMetaObject
之类的东西,因为它不知道YourClass
存在。通常在头文件中定义 classes,其中包含
Q_OBJECT
。moc
然后在其生成的输出中添加一个#include "header.h"
,这意味着moc
的输出可以愉快地编译。但是如果您的 class 定义在
.cpp
中怎么办?您不能在moc
的输出中#include
一个.cpp
文件,因为那样会给您大量的重定义错误。相反,您
#include
moc
的输出在您的.cpp
中,以便它被编译在一起,每个人都很高兴。 (这意味着qmake
只会发出一个规则说 运行moc
,而不是告诉编译器编译moc
的输出的另一条规则。)
从 2. 你也可以假设在 .h
中用 Q_OBJECT
定义 classes 不需要任何特殊包含。
补充一下:
当xxx.h中有Q_OBJECT
时,qmake
后,系统会生成一个moc_xxx.cpp
,里面有xxx.h。
当Q_OBJECT
在xxx.cpp,qmake
之后,系统会生成一个xxx.moc
,需要在.cpp文件中加入.moc文件.