QT学习(0):qmake和编译

news2024/9/26 3:23:04

在这里插入图片描述

一、编译和链接

1.预处理

预处理是使用预处理器工具(系统在编译过程中调用的预先编写的程序)执行的 C 编译过程的第一步。C程序中所有以#符号开头的语句都会被预处理器处理,它将我们的程序文件转换为没有#语句的中间文件。

  • 删除注释
  • 宏扩展#define,预处理器创建一个中间文件,其中一些预先编写的汇编级指令替换定义的表达式或常量
  • 头文件包含#include,预处理过程中的文件包含会导致文件名的全部内容添加到源代码中,替换#include指令
  • 条件编译#ifdef,预定义的汇编代码替换所有条件编译指令,并将新扩展的文件传递给编译器

2.编译

使用内置编译器软件将中间文件( .i ) 转换为汇编文件( .s )。编译阶段包括语法分析(语法结构)、语义分析(变量的声明和使用、类型检查等)和生成汇编代码等操作。

3.汇编

使用汇编器将汇编级代码(.s文件)转换为机器可理解的代码(二进制/十六进制形式)。生成目标文件.obj/.o,包含生成的机器码以及其他信息,如符号表(代码中所有符号,如函数、变量、标签,及其对应内存地址的表格)、重定位信息(全局符号、外部符号或库的实际地址)和调试数据(源代码文件的映射关系、函数和变量的名称、行号信息、堆栈跟踪信息等。调试数据可以用于在程序崩溃或出现错误时定位问题所在,以及在调试器中进行断点设置、变量查看等操作)。

4.链接

将库文件包含到我们的程序中的过程,生成可执行文件.exe/.out,.dll/.so, .lib/.a。包含a.符号解析b.符号重定位c.符号合并d.库文件链接e.生成可执行文件或共享库。

二、构建系统——自动化编译和链接过程

1.Make

Make是一个构建自动化工具,它通过读取Makefile文件来确定如何编译和链接源代码文件。Makefile指定文件之间的依赖关系,并定义编译规则。Make根据这些规则确定哪些文件需要重新构建,然后调用适当的编译器和链接器命令来构建目标可执行文件。

2.CMake

CMake是一个跨平台的构建系统,允许开发者以与平台无关的方式定义构建过程。它使用CMakeLists.txt文件来指定构建配置、依赖关系和编译器选项。CMake会生成特定平台的构建文件(如Makefile)或不同构建系统的项目文件(.sln和.vcxproj文件)。

3.QMake

QMake是专门用于Qt应用程序的构建系统。它是Qt框架的一部分,简化了Qt项目的构建过程。QMake使用.pro文件来指定项目配置、依赖关系和构建规则。可以根据项目文件(.pro文件)生成不同平台和不同构建系统所需的构建规则(makefile)和项目文件(.sln和.vcxproj文件)。

执行qmake demo.pro可以生成makefile。

三、qt工具

1、MOC(Meta-Object Compiler)

元对象编译器,moc 处理 C++ 头文件的类定义里面的Q_OBJECT宏,它会生成源代码文件,比如moc_class.cpp ,其中包含相应类的元对象代码,元对象代码主要用于实现 Qt 信号/槽机制、运行时类型定义、动态属性系统。

如在输出文件夹中生成的 moc_mainwindow.cpp 为mainwindow类生成额外的数组、结构体和函数,和mainwindow.cpp一起加入到编译系统。

#include "../mainwindow.h"
//.........
const QMetaObject *MainWindow::metaObject() const
{
    return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
}

makefile同时中包含mainwindow.cppmoc_mainwindow.cpp

####### Files

SOURCES       = main.cpp \
		mainwindow.cpp \
		Release/moc_mainwindow.cpp \
		#..........

2、UIC(User Interface Compiler)

用户界面编译器,Qt 使用 XML 语法格式的 class.ui 文件定义用户界面,uic 根据class.ui 文件生成用于创建用户界面的 C++ 代码头文件,比如ui_class.h

mainwindow.ui以XML格式组织控件。

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
//......

UIC由UI文件生成ui_mainwindow.h,在mainwindow.cpp中引用该头文件,并在构造函数初始化列表初始化成员变量ui,在构造函数体中一开始通过ui->setupUi(this)初始化该mainwindow对象。

private:
    Ui::MainWindow *ui;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

ui_mainwindow.h中定义一个Ui_MainWindow类,在该类中定义centralwidget指针和其它在qt designer中拖拽的控件指针,并通过setupUi函数将MainWindow类对象的指针传递进去,将成员控件实例化为MainWindow类对象的子控件,并在setupUi()中设置控件属性和内容。

这等效于在MainWindow构造函数中通过程序去新建控件并手动设置控件,只是QT中通过UIC和qt designer可以将新建控件这一过程通过在编辑界面中拖拽的方式可视化、并自动生成对应的C++代码。

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    //.........
    void setupUi(QMainWindow *MainWindow)
    {
        //..............
        centralwidget = new QWidget(MainWindow);
        centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
        //..........
    }
};

3、RCC(Resource Compiler)

资源文件编译器,负责在项目构建过程中编译.qrc 资源文件,并生成 C++ 或 Python 源文件,或 .rcc 文件。

默认情况下,rcc 将生成 C++ 源代码(qrc_resource.cpp),然后将其编译为可执行文件或库的一部分(qrc_resource.o)。 -g python 选项会生成 Python 源代码。 -binary 选项生成一个二进制存档,按照惯例保存在 .rcc 文件中,并且可以在运行时加载。

QT资源收集文件(.qrc)

.qrc 文件是一个 XML 文档,它枚举要作为运行时资源包含的本地文件,用作 rcc 的输入。每个 <file> 元素都标识应用程序源树中的一个文件,路径是相对于包含 .qrc 文件的目录进行解析的。

<RCC>
    <qresource prefix="/">
  		<file>image/enter.svg</file>
        <file>image/shift.svg</file>
    </qresource>
</RCC>

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

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

相关文章

【TC3xx】GETH

目录 一、RGMII 二、SMI接口 三、TC3xx MCAL 3.1 MCU 3.2 Port 3.3 DMA 3.4 中断配置 3.5 ETH 3.6 集成 一、RGMII TC3xx支持MII/RMII/RGMII三种以太网数据通信接口。其中RGMII经常用于MAC和MAC之间&#xff0c;或MAC与PHY之间的通信&#xff0c;RGMII的带宽可以是10M…

对于初学者来说,从哪些方面开始学习 Java 编程比较好?

对于初学者来说&#xff0c;从哪些方面开始学习 Java 编程比较好&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Java的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全…

vue2-安装elementUI时警告

警告内容&#xff1a;npm WARN deprecated core-js2.6.12: core-js<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up …

机器学习可重复性危机下,创建复杂数据系统的挑战

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 数据科学系统已成为众多研究领域的关键性工具&#xff0c;其开发者群体呈现出多元化的背景特征。在过去十年中&#xff0c;尽管数据科学与机器学习的强…

OpenSSL的源码在哪里下载?

官方网站去下载&#xff0c;网址&#xff1a; https://www.openssl.org/source/ 比较老的版本的下载页面地址&#xff1a; https://www.openssl.org/source/old/ 由于某面板的OpenSSL模块的安装配置语句如下&#xff1a; --with-openssl/root/rpmbuild/BUILD/openssl-1.0.2u所…

TreeSelect 树型选择控件 编辑回显时所选的值与展开后的数据不对应 解决方案

一、业务场景&#xff1a; 最近在使用Vue框架和antd-vue组件库的时候&#xff0c;发现在做编辑回显时** TreeSelect 树型选择控件** 组件的选中的值能拿到&#xff0c;但是在下拉列表的回显位置有偏差。为了大家后面遇到和我一样的问题&#xff0c;给大家分享一下 二、bug信息…

商城免费搭建之java鸿鹄云商 java电子商务商城 Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

鸿鹄云商 SAAS云产品概述 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、My…

el-tooltip 修改全局的样式 (默认的太丑了)

默认的是黑色的框 话不多说,上代码 : .atooltip.el-tooltip__popper[x-placement^"top"] .popper__arrow {border-top-color: #fff;color: #999;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); } .atooltip.el-tooltip__popper[x-placement^"top"] .popp…

kotlin 基础概览

继承类/实现接口 继承类和实现接口都是用的 : &#xff0c;如果类中没有构造器 ( constructor )&#xff0c;需要在父类类名后面加上 () &#xff1a; class MainActivity : BaseActivity(), View.OnClickListener 空安全设计 Kotlin 中的类型分为「可空类型」和「不可空类型」…

嵌入式培训-数据结构-day23-线性表

线性表 线性表是包含若干数据元素的一个线性序列 记为&#xff1a; L(a0, ...... ai-1, ai, ai1 ...... an-1) L为表名&#xff0c;ai (0≤i≤n-1)为数据元素&#xff1b; n为表长,n>0 时&#xff0c;线性表L为非空表&#xff0c;否则为空表。 线性表L可用二元组形式描述…

冲压模具市场调研:2023年该行业发展现状及前景分析

汽车冲压件模具是汽车车身生产的重要工艺装备&#xff0c;是汽车换型的主要制约因素。汽车冲压件模具具有尺寸大、型面复杂、精度要求高等特点&#xff0c;属于技术密集型产品。 汽车冲压模具能快速精密地把材料直接加工成零件或半成品并通过焊接、铆接、拼装等工艺装配成零部件…

ChatGLM3-6B模型介绍及微调

文章目录 ChatGLM3-6B的强大特性更强大的基础模型更完整的功能支持更全面的开源序列 ChatGLM3-6B的部署basic版部署集成版部署 ChatGLM3-6B-base 微调ChatGLM3-6B-chat 微调多轮对话微调单轮对话微调 ChatGLM3-6B的强大特性 项目地址&#xff1a;https://github.com/THUDM/Cha…

基于node 安装express后端脚手架

1.首先创建文件件 2.在文件夹内打开终端 npm init 3.安装express: npm install -g express-generator注意的地方&#xff1a;这个时候安装特别慢,最后导致不成功 解决方法&#xff1a;npm config set registry http://registry.npm.taobao.org/ 4.依次执行 npm install -g ex…

shopify商城开发 引用谷歌字体库 fonts.google.com

引用谷歌字体库 https://fonts.google.com/ <link rel"preconnect" href"https://fonts.googleapis.com"> <link rel"preconnect" href"https://fonts.gstatic.com" crossorigin> <link href"https://fonts.goo…

详细了解云堡垒机的作用,提高企业数据信息安全

随着上云企业的不断增加&#xff0c;云上数据安全性成为企业面临的重要问题。为了保障企业的核心数据安全&#xff0c;越来越多的企业采购了云堡垒机来提升数据安全性。今天我们就来详细了解一下云堡垒机的作用&#xff0c;以及如何提高企业数据安全。 一、云堡垒机定义 云堡垒…

LabVIEW进行癌症预测模型研究

LabVIEW进行癌症预测模型研究 癌症是一种细胞异常增生的疾病。随着年龄的增长&#xff0c;细胞分裂速度放缓&#xff0c;但癌细胞会失去控制地不断分裂&#xff0c;形成可能良性或恶性的肿瘤。 2012年的国际癌症数据显示&#xff0c;新发癌症病例和癌症相关死亡人数有所增加。…

springboot使用EasyExcel导入数据

springboot使用EasyExcel导入数据 1. 引入依赖 <!-- Easy Excel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version> </dependency>2. 建立对应实体类 假如…

多线程JUC 第2季 CAS的作用介绍

一 CAS作用介绍 1.1 CAS作用 CAS有3个操作数&#xff0c;位置内存值V&#xff0c;旧的预期值A&#xff0c;要修改的更新值B&#xff0c;如果内存值V和预期值相同则&#xff0c;内存值改为B&#xff0c;否则什么都不做。当它重来重试的这种行为称为-自旋。 CAS是一条cpu的原…

为什么越来越多的人从事软件测试行业?

1.市场需求增加&#xff1a;随着数字化转型和互联网的普及&#xff0c;各行各业都需要高质量、稳定可靠的软件来支持其业务运作。因此&#xff0c;对软件测试人员的需求也随之增加。同时&#xff0c;新兴技术的发展&#xff0c;如物联网、大数据、区块链、人工智能等&#xff0…

git学习笔记03(小滴课堂)

详解分支的基本操作 创建分支&#xff1a; 查看分支&#xff1a; 切换分支&#xff1a; git branch 中星号是当前分支。 idea中也更新了。 提交上去。 我们新建个分支&#xff1a; 我们新建分支是复制当前分支&#xff0c;而不是直接复制的主分支。 我们切换回主分支&#xf…