引用moc文件

在这里插入图片描述

问题

在使用qt的qtpropertybrowser控件时,在.cpp文件尾部中看到#include<moc_qtpropertybrowser.cpp>

回答

qmake必须在makefile中生成规则去调用moc编译器处理这个cpp文件,这个特殊的引用会触发qmake去这样做,告诉它哪一个是MOC的输出文件
为了编译MOC的输出(仍然是C++源文件),编译器必须看到类的定义,否则会提示没有class::staticMetaObject(在moc_class.cpp中)类似的信息,因为它不知道这个类的存在

通常,我们在头文件中定义具有 Q_OBJECT 的类。然后 moc 将 #include “class.h” 添加到其生成的moc_class.cpp中,这意味着 moc_class.cpp可以顺利编译。但是如果您的类定义位于 .cpp 内怎么办?您不能在 moc_class.cpp中#include .cpp 文件,因为这会给您带来大量的重新定义错误(编译时编译两次,一次是cpp本身,一次是moc引用的cpp)。相反,您可以在 .cpp 中#include moc_class.cpp,以便将其编译在一起并且每个人都满意。 (这意味着 qmake 只会发出一条规则来运行 moc,但不会发出另一条规则来告诉编译器编译 moc_class.cpp)

来源:https://stackoverflow.com/questions/34928933/

结论

如果一个 .cpp 文件中包含了 Q_OBJECT 宏的类定义时,需要在文件中添加moc文件的引用
并且构建系统在构建过程中自动检测到这个类,并调用 moc 工具生成对应的 .moc 文件。
在编译过程中,构建系统会根据 .cpp 文件的依赖关系,自动编译并链接 .moc 文件,以及其他需要的目标文件,最终生成可执行文件。
因此,不需要手动编译或添加 .moc 文件。构建系统会自动处理这个过程,并确保 .moc 文件被正确引用和使用。

MOC编译器

在交给gcc进行标准编译之前先调用moc分析源文件,如果发现Q_OBJECT在源文件前加上moc_生成moc_a.cpp将这个新文件加入编译系统,最终被连接到二进制代码中。

moc_class.cpp包含:
1.class::staticMetaObject、静态元对象存储元对象所有数据和相关信息
2.class::metaObject()、返回静态元对象
3.class::qt_metacast()、转化返回为QObject对象
4.Qt_meta_stringdata_bateObject变量中存储类名、属性、函数名、信号名
5.其他相关

moc编译器的处理过程可以分为以下几个步骤:

  1. 解析源代码:moc首先会读取指定的源代码文件(通常是以.h扩展名结尾的文件),并解析其中的内容。

  2. 查找元对象宏:moc会在源代码中查找特定的宏,例如Q_OBJECT宏。这些宏用于标记需要生成元对象代码的类。

  3. 生成元对象代码:一旦找到了元对象宏,moc会为这些类生成对应的元对象代码。这些代码包括了信号和槽的声明、元对象的元信息等。

  4. 处理信号和槽:moc会分析源代码中的信号和槽的声明,并生成相关的元对象代码。这些代码用于实现Qt的信号与槽机制。

  5. 处理扩展功能:如果源代码中使用了Qt的一些扩展功能,如动态属性、反射等,moc也会生成相应的元对象代码来支持这些功能。

  6. 生成输出文件:最后,moc将生成的元对象代码写入一个输出文件中,通常以moc_开头并以.cpp扩展名结尾。这个输出文件可以与其他源代码文件一起编译,以创建最终的可执行程序或库。

需要注意的是,moc只处理具有元对象宏的类,其他的普通类不会被moc处理。这样可以避免对所有类都生成额外的代码,减小了编译和链接的开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值