在Qt中,直接include <moc_xxxxx.cpp> 为什么不会出现符号冲突的错误?

news2024/12/24 3:28:41

在逛Qt官方社区的时候看到这样一个帖子:
https://forum.qt.io/topic/117973/how-does-include-moc_-cpp-work
大概的意思是moc_xxx.cpp如果已经被编译器编译,那么在另一个cpp文件中include同一个moc_xxx.cpp应该出现符号冲突才对,但是Qt却能正确运行。对于这个问题,@KH-219Design的回答是:

qmake 负责处理这个场景的编译问题。它会扫描cpp代码和 *.pro 文件以生成 Makefile。如果在编译器和链接器遵循在Makefile中包含的 “Automatic MOC”时,当在源代码中没有找到 #include “moc_myclass.cpp” 时,会修改makefile以包含moc_myclass.cpp:
*.o 文件:

> SOURCES       = ../src/main.cpp \
>                 ../src/myclass.cpp moc_myclass.cpp 
>                 OBJECTS       = main.o \
>                 myclass.o \
>                 **moc_myclass.o** 

当#include 了 moc 文件时,qmake 会扫描到,并相应地调整 Makefile,移除moc_myclass.cpp:

> SOURCES       = ../src/main.cpp \
>                 ../src/myclass.cpp OBJECTS       = main.o \
>                 myclass.o

可见qmake非常智能。

笔者使用cmake的工程对qmake的这个特性进行验证,发现其设计也更为巧妙。

首先,在使用了Q_OBJECT类的源码中,增加一行:
在这里插入图片描述
在CMake的Qt项目中,qmake会将一个工程的所有moc_xxx.cpp放在同一个文件中包含,例如:
XXX_autogen\mocs_compilation_Release.cpp,这个文件内容如下:
在这里插入图片描述

这样的好处是在新增Q_OBJECT类的时候,不需要修改cmakelist或者改变构建工具的行为。

接下来,我们对比//#include <moc_xxCardObjBase.cpp>注释前和注释后的区别。发现如果在源码直接包含moc_xxCardObjBase.cpp时,mocs_compilation_Release.cpp文件内容确实少了 include <2FELSIXJDY/moc_xxCardObjBase.cpp>。所以qmake确实会扫描源文件中,include<moc_xxx.cpp>的行为!!
在这里插入图片描述

这个过程中,注意到XXX_autogen\include_Debug下新生成了moc_XXCardObjBase.cpp,这个文件和之前生成的moc_XXCardObjBase.cpp.d目录不一样,之前生成的在2FELSIXJDY子目录下。
在这里插入图片描述
出于好奇也对比了这两个文件的内容,对比了moc_XXCardObjBase.cpp与2FELSIXJDY/moc_XXCardObjBase.cpp两个文件,发现其内容几乎一模一样,只有头文件的include路径变了。因为这个头文件采用的是相对路径,如果不变,会导致编译不过。
在这里插入图片描述
所以,假如我们自作聪明,直接在cpp里写#include <2FELSIXJDY/moc_XXCardObjBase.cpp>,那么反而会遇到路径错误,试了一下,果然如此。

更进一步

想要进一步了解Qt MOC的技术细节,请移步:《探究Qt5【元对象编译器,moc】的 原理和技术细节》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1878186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音频Balance源码总结

音频Balance源码总结 何为音频Balance&#xff1f; 顾名思义&#xff0c;Balance及平衡&#xff0c;平衡也就是涉及多方&#xff0c;音频左右甚至四通道&#xff0c;调节所有通道的音量比&#xff0c;使用户在空间内听到各个通道的音频大小不一&#xff0c;好似置身于真实环境…

高考落幕,暑期西北行,甘肃美食等你来尝

高考结束&#xff0c;暑期来临&#xff0c;西北之旅成为许多人的热门选择。而来到甘肃&#xff0c;除了领略壮丽的自然风光和深厚的历史文化&#xff0c;甘肃特产和传统面点以其独特的风味和传统的制作工艺也为游客们带来了一场地道的甘肃美食体验。 平凉的美食&#x…

成立近30年,它如何找到政企采购突破点?

回看中国采购行业的发展&#xff0c;大致可以被分为四个阶段&#xff1a;上世纪90年代的传统采购时代、本世纪初的ERP采购时代、近10年的SRM采购时代以及2018年以来开启的数字化采购时代。近年来&#xff0c;大数据、人工智能和物联网的高速发展&#xff0c;为采购信息化提供底…

读书笔记-Java并发编程的艺术-第3章(Java内存模型)-第6节(final域的内存语义)

文章目录 3.6 final域的内存语义3.6.1 final 域的重排序规则3.6.2 写final 域的重排序规则3.6.3 读final 域的重排序规则3.6.4 final 域为引用类型3.6.5 为什么 final 引用不能从构造函数内“逸出”3.6.6 final 语义在处理器中的实现3.6.7 JSR-133 为什么要增强final 的语义 3.…

[知识点篇]《计算机组成原理》之计算机系统概述

1.1 计算机发展历程 世界上第一台电子数字计算机 1946年&#xff0c;ENIAC(Electronic Numerical Integrator And Computer)在美国宾夕法尼亚大学研制成功。性能低&#xff0c;耗费巨大&#xff0c;但却是科学史上的一次划时代的创新&#xff0c;奠定了电子计算机的基础&#x…

大语言模型(LLM)LangChain介绍

LangChain是一个利用大语言模型的能力开发各种下游应用的开源框架&#xff0c;它的核心理念是为各种大语言模型应用实现通用的接口&#xff0c;简化大语言模型应用的开发难度&#xff0c;主要的模块示意图为&#xff1a; Index&#xff1a;提供了各类文档导入、文本拆分、文本向…

Java 生成随机数的方法例子

前言 在实际开发中产生随机数的例子也是很普遍的,所以在程序中设计产生随机数操作很重要&#xff0c;这篇文章主要给大家介绍了关于Java随机数的几种获得方法&#xff0c;具有一定的参考价值。 一、Random 类 Random 类是从 JDK 1.0开始&#xff0c;它产生的随机数是伪随机数…

UML建模笔记

5个视图 设计。类&#xff0c;接口&#xff0c;对象如何协作。实现。组件&#xff0c;运行程序&#xff0c;文档关系。用例。用户功能期望。进程。并发与同步相关进程&#xff0c;线程。部署。部署到计算机。 建模目的 和客户共创追踪需求变更协同开发进度控制持续迭代测试生…

【SGX系列教程】(四)Intel-SGX 官方示例分析(SampleCode)——LocalAttestation

文章目录 一.LocalAttestation原理介绍1.1本地认证原理1.2 本地认证基本流程1.3 本地认证核心原理 二.源码分析2.1 README2.1.1 编译流程2.1.2 执行流程&#xff08;双进程执行 or 单进程执行&#xff0c;在后面执行部分有展示效果&#xff09;2.1.3 如何获取已签名的Enclave的…

青岛网站建设一般多少钱

青岛网站建设的价格一般会根据网站的规模、功能、设计风格等因素来定&#xff0c;价格会存在着一定的差异。一般来说&#xff0c;一个简单的网站建设可能在数千元到一万元之间&#xff0c;而一个复杂的大型网站建设可能会需要数万元到数十万元不等。所以在选择网站建设服务时&a…

DAY17-力扣刷题

1.相同的树 100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 class Solution {public…

守护你的每一步:揭秘电子厂劳保鞋的秘密

在电子厂的繁忙车间里&#xff0c;工友们忙碌的身影中&#xff0c;你是否注意到那一双双看似普通的劳保鞋&#xff1f;它们不仅承载着工人们辛勤的汗水&#xff0c;更是守护他们每一步安全的重要装备。今天&#xff0c;就让我们一起揭秘电子厂劳保鞋的秘密&#xff0c;看看它们…

一站式企业服务平台能够帮助企业解决哪些问题?

近年来一站式企业服务平台备受区域政府及园区管理者的青睐&#xff0c;充当着区域政府或园区的千里眼和顺风耳&#xff0c;可以用来捕捉与区域经济发展相关的信息&#xff0c;也可以用来倾听企业的诉求&#xff0c;更是成为了区域深抓企业服务的多面手。 同时&#xff0c;一站式…

【漏洞复现】学分制系统GetTimeTableData SQL注入

0x01 产品简介 学分制系统由上海鹏达计算机系统开发有限公司研发&#xff0c;是基于对职业教育特点和需求的深入理解&#xff0c;结合教育部相关文件精神&#xff0c;并广泛吸纳专家、学者意见而开发的一款综合性管理系统。系统采用模块化的设计方法&#xff0c;方便学校根据自…

Java对应C++ STL的用法

sort&#xff1a; 1&#xff1a;java.util.Arrays中的静态方法Arrays.sort()方法&#xff0c;针对基本数据类型和引用对象类型的数组元素排序 2&#xff1a;java.util.Collections中的静态方法的Collections.sort()方法&#xff0c;针对集合框架中的动态数组&#xff0c;链表&…

大数据开发如何管理项目

在面试的时候总是 会问起项目&#xff0c;那在大数据开发的实际工作中&#xff0c;如何做好一个项目呢&#xff1f; 目录 1. 需求分析与项目规划1.1 需求收集与梳理1.2 可行性分析1.3 项目章程与计划 2. 数据准备与处理2.1 数据源接入2.2 数据仓库建设2.3 数据质量管理 3. 系统…

2024年4家HTTP代理服务商网站最新测评

一、芝麻HTTP芝麻HTTP作为代理服务领域的佼佼者&#xff0c;其HTTP代理服务同样表现出色。凭借海量IP资源和高效稳定的性能&#xff0c;芝麻HTTP为用户提供了卓越的代理服务体验。 特点与优势 ① 海量IP资源&#xff1a;拥有庞大的代理IP池&#xff0c;确保用户能够随时获取到…

安装OpenHarmony编译库和工具集

一、搭建开发环境 1.1、Ubuntu搭建&#xff0c;参考 VMware完美安装Ubuntu20.04-CSDN博客文章浏览阅读286次&#xff0c;点赞5次&#xff0c;收藏3次。详细介绍了VMware下安装Ubuntu20.04https://blog.csdn.net/longyuzi/article/details/139935769 1.2、拉取OpenHarmony源码…

数据结构速成--查找

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 …

核方法总结(四)——高斯过程回归学习笔记

一、定义 基于核方法的线性回归模型和传统线性回归一样&#xff0c;可以用未知数据进行预测&#xff0c;但不能确定 预测的可信度。在参考书第二章中可知&#xff0c;基于贝叶斯方法可以实现对未知数据依概率预测&#xff0c;进而可得到预测的可信度。这一方法中&#xff0c;通…