首页 > 其他分享 >Qt 项目编译流程总结

Qt 项目编译流程总结

时间:2024-04-09 15:46:50浏览次数:29  
标签:文件 exe Qt 流程 C++ 编译 moc

通过 VS 来开发 Qt 项目的过程中,整个Qt项目的编译需要如下几个过程:
Uic ----> Rcc ----> Moc ----> 预处理 -----> 编译 -----> 汇编 -----> 链接
对比普通的 C++ 项目,Qt 多了 Uic ----> Rcc ----> Moc 这三步。
现在对 QT 项目所多出的三个编译过程进行分析:

一、Uic :Qt User Interface Compiler

用户界面编译功能,uic.exe 首先需要将Qt项目中的所有 .ui 文件都编译成 ui_%(Filename).h 的C++文件。默认生成在 .\GeneratedFiles\ 目录下。该项的具体配置如下图所示

后续在其它的文件中使用UI控件,都可以通过包含对应的头文件: #include "ui_%(Filename).h" 来进行。
【注】可以单独对某一个 .ui 文件进行编译生成对应的 ui_%(Filename).h 文件,如下图,选中对应的 .ui 文件进行编译即可:

二、 Rcc:Qt Resource Compiler

然后对 Qt 项目的资源文件,即 .qrc 文件进行编译。该文件主要为项目的图片、Icon、logo等内容,通过 rcc.exe 程序将其编译成 qrc_%(Filename).cpp。对应项的默认配置如下图:

三、Moc:Qt Meta-Object Compiler

1、 Qt 元对象编译器程序 moc.exe,该程序的功能是将Qt 项目中包含有 Q_OBJECT 宏的类 编译成对应的 moc_%(Filename).cpp 文件,默认生成的路径为: .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp

2、调用 moc.exe 来编译的条件
并不是所有的文件都需要调用 moc.exe 来进行编译,只有当一个类中包含了Qt 元对象宏 Q_OBJECT时,才会自动出触发 moc.exe对包含该类的文件进行处理。因为当类中包含了Qt 元对象宏 Q_OBJECT时,表明该类需要使用 Qt 的元对象系统,以实现信号和槽、动态属性等Qt相关的特性。所以需要使用 moc.exe 来将包含该类的源文件进行处理,并生成对应的源代码文件,即moc_%(Filename).cpp
如果一个文件中的所有类都没有包含 Q_OBJECT宏时,则该文件就不会被 moc.exe 处理,也不会生成对应的 moc_%(Filename).cpp 文件。

3、 元对象编译器对应的默认配置如下所示:

几个重要的配置说明如下:

  • Execution Description:moc编译每个对应的文件的时候都会输出:Moc'ing %(Identity)...
  • Output File:moc 处理后生成的文件,默认路径为:.\GeneratedFiles$(ConfigurationName)\moc_%(Filename).cpp
  • Include Path:moc 在编译的时候需要用到的文件所在路径,一般保持默认即可,如果有调整上面的生成文件路径或需要新增其它的文件,此时需要手动添加。
  • Macro Definitions:moc 编译过程中使用到的宏,此处定义的宏一般保持默认,不做修改。但是在这里定义的宏,不能被后面的C++编译时使用。C++编译使用的宏需要定义在 C/C++ ---> Preprocessor ---> Preprocessor Definitions中。而 C/C++ 的Preprocessor Definitions中定义的宏会被 moc编译器所继承,如下图,所以在 C/C++ ---> Preprocessor ---> Preprocessor Definitions 中定义的宏也会在 moc 编译器中起作用。[如果在 C/C++ 对应的预处理器中定义的宏没有在 moc 编译过程中生效,则有一种情况是条件编译中 moc.exe 还未起作用前已经执行了条件编译的判断。此情况需要在 moc.exe 宏定义处或对应的文件起始位置定义对应的宏来解决该问题。]

四、C++ 代码的编译

Qt 项目中的各文件经过以上过程的处理之后,各自会生成对应的 .h.cpp 文件。然后整个项目才能被当作普通的C++项目来通过对应的C++编译器进行编译,经过 预处理 -----> 编译 -----> 汇编 -----> 链接 等过程,最终生成库文件或可执行文件。

标签:文件,exe,Qt,流程,C++,编译,moc
From: https://www.cnblogs.com/Jeffxu/p/18124120

相关文章

  • 网络通讯的流程以及代码
     用于演示socket的客户端:#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<unistd.h>#include<netdb.h>#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>......
  • Linux架构28 ansible流程控制, 条件判断(主机,是否安装,系统版本), 循环语句(安装启动
    Ansible流程控制一、playbook条件语句不管是shell还是各大变成语言中,流程控制,条件判断这些都是必不可少的,在我们使用Ansible的过程中,条件判断的使用频率极其高。例如:1.我们使用不同的系统的时候,可以通过判断系统来对软件包进行安装。2.在nfs和rsync安装过程中,客户端服务器......
  • Qt加Opencv实现 梯度矫正 功能
    废话:有时候我们是从物品的斜上方拍摄的图片,看起来不直观,需要把视角拉正,这样的一个操作就叫做梯度矫正,需要用到的技术是Opencv的透视变换。这个只是一个简单的演示demo,如果完善一下,比如物品检测,可以应用更多的场景,比如常见的:文件、资料上传,软管摄像头的应用等,怎么说也是一个......
  • MQTT基础
    1、MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议2、MQTT历史:MQTT协议最初版本是在1999年建立的。他们当时正在开发一个利用卫星通讯监控输油管道的项目。为了实现这个项目要求,他们需要开发一种用于嵌入式设备的通讯协议,这种通讯协议必须满足以下条件:易于实现数......
  • MQTT用python写的收消息例子
    在MQTT官网给的sub_wss.py例子中修改改写自己的用户名和密码BROKER='*******.ala.cn-hangzhou.emqxsl.cn'//改成自己的连接地址USERNAME='**************'//用户名PASSWORD='*************'//密码注意这句是改使用v1回调API(与旧版本的库一起使用)。原......
  • 【QT教程】QT6 QML编程
    QT6QML编程使用AI技术辅助生成QT界面美化视频课程QT性能优化视频课程QT原理与源码分析视频课程QTQMLC++扩展开发视频课程免费QT视频课程您可以看免费1000+个QT技术视频免费QT视频课程QT统计图和QT数据可视化视频免费看免费QT视频课程QT性能优化视频免费看免......
  • qt实现实时抓取串口数据,并对数据做解密处理
    效果:       1.实时抓取串口数据,并对串口数据做解密,解密后显示在QTextEdit上。       2.对显示的内容做特殊关键字标记处理,比如对出现的Error关键字标红               高亮另一个版本       3.对显示的明文进行查询,类似编辑文件中......
  • Qt中显示hex数据的控件
    效果类似QTextEdit,但是显示十六进制的数据,比如用于显示抓取串口或者bin文件的数据等等chunks.h#ifndefCHUNKS_H#defineCHUNKS_H/**\conddocNever*//*!TheChunksclassisthestoragebackendforQHexEdit.**WhenQHexEditloadsdata,Chunksaccessthe......
  • CEF编译报错:ValueError: path is on mount '\\\\tab_group_types.mojom-webui.js'
    F:\code\chromium_git\chromium\src>autoninja-Cout\Debug_GN_x64cef"f:\code\depot_tools\bootstrap-2@3_11_6_chromium_30_bin\python3\bin\python3.exe"F:\code\depot_tools\ninja.py-Cout\Debug_GN_x64cef-j10ninja:Enteringdirec......
  • 2-48. 实现鼠标选中物品后的场景点击事件流程
    修改CursorManager修改EventHandler修改Player修改GridMapManager继续修改CursorManager继续修改EventHandler我们希望人物扔出东西的时候,不是直接在地面上生成一个物品,而是有一个扔的效果修改ItemManager修改InventoryManager继续修改GridMapMa......