当前位置: 首页 > news >正文

Qt扫盲-QMake 使用概述

QMake 使用概述

  • 一、概述
  • 二、简单开始
  • 三、使应用程序可调试
    • 1. 添加平台特定的源文件
    • 2. 如果文件不存在,停止qmake
    • 3. 检查多个条件

一、概述

本教程教你qmake的基础知识。qmake 其实就是一个自动化编译的流程控制文件,也是Qt程序的生成makefile的工具,qmake 其实就是来解析 Qt Pro文件的一个程序,基本上我们主要还是通过 编写 pro 工程文件,然后调用 qmake 命令来生成Makefile, 最后生成可执行文件的过程。qmake 其实就是和 cmake 一样的,生成一个Makefile 的工具。只是qmake 是qt 提供的一个跨平台 生成Makefile的软件,我一般也是用 qmake 多些,因为更简单些。

二、简单开始

让我们假设您刚刚完成了应用程序的基本实现,并创建了以下文件:

  • hello.cpp
  • hello.h
  • main.cpp

我们需要做的第一件事是添加告诉 qmake 作为开发项目一部分的源文件和头文件的行。

即是通过设置一些变量来完成的。

我们首先将源文件添加到项目文件中。为此,您需要使用 SOURCES 变量。只需用 SOURCES += 开始新一行,并在其后加上hello.cpp。你应该有这样的东西:

SOURCES += hello.cpp

我们可以对项目中的每个源文件重复这一步骤,直到得到如下结果:

SOURCES += hello.cpp
SOURCES += main.cpp

如果你更喜欢使用类似make的语法,你可以使用换行转义,就像这样:

SOURCES = hello.cpp \main.cpp

既然源文件已经在项目文件中列出,那么必须添加头文件。添加这些文件的方式与源文件完全相同,只是我们使用的变量名是 HEADERS

一旦你这样做了,你的项目文件应该看起来像这样:

HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp

生成的目标名称将自动设置。它与项目文件名相同,但具有适合于平台的后缀。例如,如果项目文件名为 hello.pro 在Windows上目标是hello.exe,在Unix上目标是hello。

如果你想使用不同的名称,你可以在项目文件中通过 TARGET 来设置这个可执行文件名叫 helloworld :

TARGET = helloworld

完成的项目文件应该是这样的:

HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp

下面生成这些的命令我们可以了解就行,基本上我们都是在GUI的Qt Creator IDE下开发,我们只需要点击 运行 按钮就能运行出结果啦。

现在可以使用qmake为应用程序生成Makefile。在命令行中,在项目目录中,键入以下命令:

qmake -o Makefile hello.pro

然后根据你使用的编译器输入make或nmake。

对于Visual Studio用户,qmake还可以生成Visual Studio项目文件。例如:

qmake -tp vc hello.pro

三、使应用程序可调试

应用程序的发布版本不包含任何调试符号或其他调试信息。在开发过程中,生成具有相关信息的应用程序的调试版本是很有用的。通过向项目文件中的 CONFIG 变量添加 debug ,可以轻松实现这一点。

例如:

CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp

像以前一样使用qmake生成Makefile。现在,在调试环境中运行应用程序时,您将获得有关应用程序的有用信息。

1. 添加平台特定的源文件

经过几个小时的编码之后,您可能已经开始了应用程序中特定于平台的部分,并决定将依赖于平台的代码分开。

现在有两个新文件要包含到项目文件中:helloin .cpp和hellounix.cpp。我们不能仅仅将这些文件添加到SOURCES变量中,因为这会将两个文件都放在Makefile中。因此,我们在这里需要做的是使用一个作用域,它将根据我们为哪个平台构建而被处理。

为Windows添加平台相关文件的简单作用域如下所示:

win32 {SOURCES += hellowin.cpp
}

当构建Windows时,qmake将helloin .cpp添加到源文件列表中。在为其他平台构建时,qmake会忽略它。现在剩下要做的就是为特定于unix的文件创建一个作用域。
当你这样做了,你的项目文件应该看起来像这样:

CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp# windows
win32 {SOURCES += hellowin.cpp
}# 类unix 包含 Linux
unix {SOURCES += hellounix.cpp
}

这个就是条件编译一样,也会像以前一样使用qmake生成Makefile。

2. 如果文件不存在,停止qmake

如果某个文件不存在,您可能不想创建Makefile。我们可以使用exists()函数来检查文件是否存在。我们可以使用error()函数停止qmake的处理。这与作用域的工作方式相同。只需将作用域条件替换为函数。一个名为main.cpp的文件的检查是这样的:

!exists( main.cpp ) {error( "No main.cpp file found" )
}

!符号用于否定测试。也就是说,如果文件存在,exists(main.cpp)为真,如果文件不存在,!exists(main.cpp)为真。

CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
win32 {SOURCES += hellowin.cpp
}
unix {SOURCES += hellounix.cpp
}
!exists( main.cpp ) {error( "No main.cpp file found" )
}

像之前一样使用qmake来生成makefile。如果暂时重命名main.cpp,将在编译输出区看到消息,qmake将停止处理。

3. 检查多个条件

假设你使用的是Windows,你希望在命令行中运行应用程序时能够通过qDebug()看到语句输出。要查看输出,您必须使用适当的控制台设置构建应用程序。在Windows上,我们可以轻松地将console放在配置行中,在Makefile中包含此设置。然而,假设我们只想在Windows上运行且debug已经在配置行中时添加配置行。这需要使用两个嵌套作用域。首先创建一个作用域,然后在其中创建另一个作用域。将需要处理的设置放在第二个作用域中,如下所示:

win32 {debug {CONFIG += console}}

嵌套的作用域可以用冒号连接在一起,因此最终的项目文件如下所示:

CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cppwin32 {SOURCES += hellowin.cpp
}unix {SOURCES += hellounix.cpp
}!exists( main.cpp ) {error( "No main.cpp file found" )
}win32:debug {CONFIG += console
}

相关文章:

Qt扫盲-QMake 使用概述

QMake 使用概述一、概述二、简单开始三、使应用程序可调试1. 添加平台特定的源文件2. 如果文件不存在,停止qmake3. 检查多个条件一、概述 本教程教你qmake的基础知识。qmake 其实就是一个自动化编译的流程控制文件,也是Qt程序的生成makefile的工具&…...

Spring Cloud之Zuul

目录 简介 Zuul中的过滤器 过滤器的执行流程 使用过滤器 route过滤器的默认三种配置 路由到服务 路由到url地址 转发给自己 自定义过滤器 简介 Zuul是Netflix开源的微服务网关,主要功能是路由转发和过滤器,其原理也是一系列filters&#xff0…...

为什么要有分布式锁?

Redis避坑指南:为什么要有分布式锁?作者:京东保险 张江涛1、为什么要有分布式锁?JUC提供的锁机制,可以保证在同一个JVM进程中同一时刻只有一个线程执行操作逻辑;多服务多节点的情况下,就意味着有…...

【Redis】Redis持久化之RDB详解(Redis专栏启动)

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公…...

Retinanet网络与focal loss损失

参考代码:https://github.com/yhenon/pytorch-retinanet 1.损失函数 1)原理 本文一个核心的贡献点就是 focal loss。总损失依然分为两部分,一部分是分类损失,一部分是回归损失。 在讲分类损失之前,我们来回顾一下二…...

Spring事务的失效场景

事务失效场景 方法用private或final修饰 Spring底层使用了AOP,而AOP的实现方式有两种,分别是JDK动态代理和CGLIB,JDK动态代理是实现抽象接口,CGLIB是继承父类,无论哪种方式,都需要重写方法来进行方法增强,而…...

芯动联科在科创板IPO过会:拟募资10亿元,金晓冬为实际控制人

2月13日,上海证券交易所披露的信息显示,安徽芯动联科微系统股份有限公司(下称“芯动联科”)获得科创板上市委会议审议通过。据贝多财经了解,芯动联科于2022年6月24日在科创板递交招股书。 本次冲刺上市,芯…...

数据结构之单链表

一、链表的组成 链表是由一个一个的节点组成的,节点又是一个一个的对象, 相邻的节点之间产生联系,形成一条链表。 例子:假如现在有两个人,A和B,A保存了B的联系方式,这俩人之间就有了联系。 A和…...

儿子跟妈妈关系不好怎么办?这里有解决办法!

15岁的男孩子正处于青春期,很多男孩都傲慢自大,听不进去别人的建议,以自己为中心,认为自己能处理好自己的事情,不想听父母的唠叨。母亲面对青春期的孩子也是举手无措,语气不好,会让孩子更叛逆。…...

论文投稿指南——中文核心期刊推荐(植物保护)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...

华科万维C++章节练习4_6

【程序设计】 题目: 编程输出下列图形,中间一行英文字母由输入得到。 A B B B C C C C C D D D D D D D C C C C C B B B A 开头空一格,字母间空两格…...

详解子网技术

一 : Internet地址 Intemet实质上是把分布在世界各地的各种网络如计算机局域网和广域网、数字数据通信网以及公用电话交换网等互相连接起来而形成的超级网络。但是 , 网络的物理地址给Internet统一全网地址带来两个方面的问题: 第一,物理地址是物理网络技术的一种…...

chatGTP的全称Chat Generative Pre-trained Transformer

chatGPT,有时候我会拼写为:chatGTP,所以知道这个GTP的全称是很有用的。 ChatGPT全名:Chat Generative Pre-trained Transformer ,中文翻译是:聊天生成预训练变压器,所以是GPT,G是生…...

hive数据存储格式

1、Hive存储数据的格式如下: 存储数据格式存储形式TEXTFILE行式存储SEQUENCEFILE行式存储ORC列式存储PARQUET列式存储 2、行式存储和列式存储 解释: 1、上图左面为逻辑表;右面第一个为行式存储,第二个温列式存储; …...

mysql数据库备份与恢复

mysql数据备份: 数据备份方式 物理备份: 冷备:.冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库热备:一般用于保证服务正常不间断运行,用两台机器作为服务机器,一台用于实际数据库操作应用,另外…...

《NFL橄榄球》:辛辛那提猛虎·橄榄1号位

辛辛那提猛虎(英语:Cincinnati Bengals),又译辛辛那提孟加拉虎,是一支职业美式橄榄球球队位于俄亥俄州辛辛那提。他们现时为美联北区的其中一支球队,他们在1968年加入美国橄榄球联合会,并在1970…...

2、线程、块和网格

目录一、线程、块、网格概念二、代码分析2.1 打印第一个线程块的第一线程2.2 打印当前线程块的当前线程2.3 获取当前是第几个线程一、线程、块、网格概念 CUDA的软件架构由网格(Grid)、线程块(Block)和线程(Thread&am…...

C++ 算法主题系列之贪心算法的贪心之术

1. 前言 贪心算法是一种常见算法。是以人性之念的算法,面对众多选择时,总是趋利而行。 因贪心算法以眼前利益为先,故总能保证当前的选择是最好的,但无法时时保证最终的选择是最好的。当然,在局部利益最大化的同时&am…...

请注意,PDF正在传播恶意软件

据Bleeping Computer消息,安全研究人员发现了一种新型的恶意软件传播活动,攻击者通过使用PDF附件夹带恶意的Word文档,从而使用户感染恶意软件。 类似的恶意软件传播方式在以往可不多见。在大多数人的印象中,电子邮件是夹带加载了恶…...

【Kubernetes】【二】环境搭建 环境初始化

本章节主要介绍如何搭建kubernetes的集群环境 环境规划 集群类型 kubernetes集群大体上分为两类:一主多从和多主多从。 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境多主…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...

基于Java项目的Karate API测试

Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...