元对象编译器moc
moc工具可以看成是一个C++预处理程序,用来扩展C++的特性,比如Qt的信号和槽的机制,它并不是标准C++的特性,但经过moc的预处理之后,所有信号和槽相关的代码都被“翻译”成了标准的C++,从而能够被gcc等编译。
• 在Makefile中使用moc
我们通常使用Qt提供的qmake工具来自动生成Makefile,这样做的好处是不用自己手动去添加很多Qt需要的规则,比如调用moc工具等。
如果在某些情况下需要手动编写Makefile时,我们可以用下面的规则来调用moc:
根据Makefile的规则,这里的含义是对所有头文件*.h,利用moc进行处理并得到moc_*.cpp。生成moc_*.cpp之后不要忘记你还同样需要对它进行编译和链接,所以你需要将它加到SOURCES和OBJECTS(可能是其他类似含义的变量)中。
如果你对这种Makefile的写法还不太熟悉,可以参考qmake自动生成的Makefile,依葫芦画瓢就可以了。
• moc用法详解
moc支持的如下所示的一些命令行选项:
-o file
将输出写到参数file(不指定的话将写到标准输出)。
-f [<file>]
强制在输出文件中生成#include声明。这个选项在你的头文件没有遵循标准命名法则的时候才有用——当头文件的扩展名以H或h开始时,#include声明会自动生成,不需要使用-f 选项。文件名<file>为可选项。
-i
不在输出文件中生成#include声明,与-f正好相反。当一个C++文件包含一个或多个类声明的时候可能用到。
-nw
不产生任何警告。不建议使用。
-p <path>
在元对象编译器生成的#include声明的文件名称中添加路径<path>/。
-I <dir>
在头文件的包含路径中添加<dir>目录。
-E
不生成元对象相关代码(仅用于预编译)
-D<macro>[=<def>]
定义宏<macro>,或者定义宏<macro>=<def>,后者为可选项
-U<macro>
取消宏<macro>的定义
-h
显示moc的用法和选项
-v
显示moc的版本
我们还可以使用”#ifndef Q_MOC_RUN”来告诉moc工具不要处理某些代码。比如:
则moc会忽略定义在省略号部分的代码。
• 在Makefile中使用moc
我们通常使用Qt提供的qmake工具来自动生成Makefile,这样做的好处是不用自己手动去添加很多Qt需要的规则,比如调用moc工具等。
如果在某些情况下需要手动编写Makefile时,我们可以用下面的规则来调用moc:
| moc_%.cpp: %.h moc $< -o $@ |
如果你对这种Makefile的写法还不太熟悉,可以参考qmake自动生成的Makefile,依葫芦画瓢就可以了。
• moc用法详解
moc支持的如下所示的一些命令行选项:
-o file
将输出写到参数file(不指定的话将写到标准输出)。
-f [<file>]
强制在输出文件中生成#include声明。这个选项在你的头文件没有遵循标准命名法则的时候才有用——当头文件的扩展名以H或h开始时,#include声明会自动生成,不需要使用-f 选项。文件名<file>为可选项。
-i
不在输出文件中生成#include声明,与-f正好相反。当一个C++文件包含一个或多个类声明的时候可能用到。
-nw
不产生任何警告。不建议使用。
-p <path>
在元对象编译器生成的#include声明的文件名称中添加路径<path>/。
-I <dir>
在头文件的包含路径中添加<dir>目录。
-E
不生成元对象相关代码(仅用于预编译)
-D<macro>[=<def>]
定义宏<macro>,或者定义宏<macro>=<def>,后者为可选项
-U<macro>
取消宏<macro>的定义
-h
显示moc的用法和选项
-v
显示moc的版本
我们还可以使用”#ifndef Q_MOC_RUN”来告诉moc工具不要处理某些代码。比如:
| #ifndef Q_MOC_RUN ... #endif |


