Qt pro文件详解
概述
在Qt中,.pro 文件(也称为项目文件)是Qt项目管理系统(qmake)所使用的配置文件。这个文件定义了如何构建你的Qt应用程序或库,其使用简单的键值对语法,允许你指定源文件、头文件、库依赖、配置选项等。
qmake 是一个工具,它读取 .pro 文件,并生成一个标准的 Makefile(在Unix-like系统上)或者相应的项目文件(在Windows上,如Visual Studio的项目文件),以便可以使用相应的构建工具(如 make 或 IDE)来构建项目。
基本指令
1. TARGET: 指定生成的目标文件的名称(不包括文件扩展名)。
例如,TARGET = myapp 将生成名为myapp的可执行文件(在Windows上可能是myapp.exe)。
2. TEMPLATE: 指定项目的模板类型。
- app - 应用程序模板,用于生成可执行文件。这是最常见的模板类型,用于构建桌面应用程序。
- lib - 库模板,用于生成库文件(.dll、.so、.dylib或.a等,取决于平台和编译器)。这个模板可以用来构建静态库或动态库。
- subdirs - 子目录模板,用于处理包含多个子项目的项目。在这个模板下,你可以在.pro文件中指定其他.pro文件,qmake会递归地处理这些子项目。
- vcapp 和 vclib - 这两个模板与app和lib类似,但它们是为在Visual Studio中集成Qt项目而设计的。它们会生成适合在Visual Studio中打开的项目文件(.vcproj)。然而,随着Qt版本的更新,这些模板可能已经被废弃或不再推荐使用,因为Qt Creator和qmake现在提供了更好的Visual Studio集成。
- aux - 辅助模板,用于构建不生成可执行文件或库文件的项目部分,如插件或资源文件。然而,这个模板的使用并不常见,并且在最新的Qt版本中可能不再支持或已被其他机制取代。
3. CONFIG:它用于指定项目的编译和链接选项。
CONFIG变量可以包含多个选项,这些选项可以是Qt内置的,也可以是用户自定义的。每个选项都影响着qmake生成Makefile的方式,以及项目的编译和链接过程。
1)以下是一些常见的内置CONFIG选项:
- c++11、c++14、c++17、c++20等:指定使用的C++标准版本。
- debug:构建调试版本的项目。
- release:构建发布版本的项目。注意,debug和release通常是互斥的,但在某些情况下,你可以通过条件语句在.pro文件中同时定义它们,以便为不同的构建配置生成不同的目标。
- staticlib、sharedlib:指定生成静态库或动态库。注意,这些选项通常与TEMPLATE = lib一起使用。
- qt:启用对Qt模块的支持。这个选项是默认启用的,但你可以通过条件语句来禁用它。
2)自定义的CONFIG:变量、函数、第三方库等。
3)注意:
- CONFIG选项是大小写不敏感的,但出于一致性和可读性的考虑,建议使用小写字母。
- CONFIG选项可以多次添加到.pro文件中,qmake会合并它们。但是,请注意某些选项(如debug和release)可能是互斥的。
- 你可以使用条件语句(如if、else、for等)来根据CONFIG选项的值控制.pro文件中的其他设置。
4. QT:用于指定项目将使用的Qt模块。QT变量可以包含多个模块名,这些模块名之间用空格分隔。
例如:QT += core gui widgets
项目需要链接Qt的核心(core)、图形用户界面(gui)和窗口部件(widgets)模块。
Qt模块通常分为几大类,包括但不限于:
- 核心模块(如core):提供非GUI功能,如字符串处理、容器、文件访问、时间处理、线程和进程等。
- GUI模块(如gui、widgets):提供窗口系统、事件处理、绘图、字体、图像等GUI功能。
- 网络模块(如network):提供网络通信功能,如TCP/IP客户端和服务器、UDP、SSL/TLS等。
- 数据库模块(如sql):提供数据库访问功能,支持多种数据库系统。
- 多媒体模块(如multimedia):提供音频、视频和摄像头访问功能。
- Web模块(如webengine):提供基于Chromium的Web浏览器引擎,用于在Qt应用程序中嵌入Web内容。
注意:随着Qt版本的更新,可用的模块和它们的名称可能会发生变化。因此,建议查阅你正在使用的Qt版本的官方文档,以获取有关可用模块的最新信息。
文件列表指令
- SOURCES: 列出项目中的所有C++源文件。qmake会自动将这些文件编译成目标代码。
- HEADERS: 列出项目中的所有头文件。这些文件通常被包含在源文件中,但不需要单独编译。
- FORMS: 列出由Qt Designer创建的UI文件。qmake会使用uic工具将这些文件转换成C++代码。
- RESOURCES: 列出资源文件(.qrc),这些文件定义了应用程序中使用的图标、图片等资源。
- TRANSLATIONS: 列出翻译文件(.ts),这些文件用于国际化和本地化支持。
FORMS += \$$PWD/frmpage2show.uiHEADERS += \$$PWD/frmpage2show.hSOURCES += \$$PWD/frmpage2show.cppTRANSLATIONS = lang_zh.ts \lang_en.tsRESOURCES += \resources.qrc
其他常用指令
- INCLUDEPATH: 指定编译器搜索头文件的额外路径。这对于包含非标准位置的头文件非常有用。
- LIBS: 指定链接器需要链接的外部库。可以指定库文件的路径和名称,以及任何必要的库搜索路径。
- DEFINES: DEFINES变量用于指定在编译时传递给C++预处理器的一系列宏定义。
1)DEFINES变量可以包含多个宏定义,它们之间用空格分隔。请注意,在.pro文件中定义宏时,不会直接指定值;相反,你需要在源代码中使用#ifdef、#ifndef、#if defined(...)等预处理指令来检查宏是否被定义。
// 例如:
DEFINES += MY_FEATURE_ENABLED USE_LOGGING
在编译时,这些宏会被添加到C++预处理器的宏定义列表中,因此你可以在项目的源代码中这样使用它们:
#ifdef MY_FEATURE_ENABLED //启用某个特性的代码
#endif#ifdef USE_LOGGING //记录日志的代码
#endif
2).pro文件不直接支持为宏指定值。但是,你可以通过一些技巧来实现类似的效果,比如使用DEFINES来定义宏,并在源代码中根据这个宏的存在与否来设置另一个宏的值。
3)DEFINES变量中定义的宏在项目的所有源文件和头文件中都是可见的,除非你在源代码中使用了条件编译指令来限制它们的作用范围。因此,请确保你的宏名称具有足够的唯一性,以避免与Qt库或其他第三方库中的宏名称冲突。
- VERSION: 指定项目的版本号。这对于生成包含版本信息的文件或资源很有用。
- SUBDIRS: 在使用subdirs模板时,指定要构建的子目录列表。
SUBDIRS变量用于指定当前项目应该包含的子项目(子目录)。这允许你将一个大型项目分解成多个更小的、更易于管理的部分,每个部分都可以有自己的.pro文件和构建配置。
当SUBDIRS变量被设置时,qmake会首先处理当前项目文件(即包含SUBDIRS变量的那个.pro文件),然后递归【1】地处理每个指定的子目录中的.pro文件。
SUBDIRS变量的值是一个或多个子目录的名称,这些名称之间用空格分隔。每个子目录都应该包含一个.pro文件,该文件定义了该子项目的构建规则。
// 例如:
SUBDIRS += JpLoginMng
SUBDIRS += UI
SUBDIRS += components
或
SUBDIRS += \
JpLoginMng\
UI\
components
或
SUBDIRS += JpLoginMng UI components
//【2】
SUBDIRS += JPKeyboard/3rdparty/pinyin/pinyin.pro
SUBDIRS += JPKeyboard/JPKeyboard.pro
你还可以在每个子目录的.pro文件中使用CONFIG变量来指定该子项目的特定构建配置,如debug、release、staticlib等。这些配置将仅影响该子项目,而不会影响其他子项目或顶层项目。
【1】递归处理,若SUBDIRS += src,会递归的执行src中的所有pro文件吗?
并不会递归地执行src目录中的所有.pro文件。
qmake只会处理SUBDIRS变量中明确指定的子目录(或子项目)中的.pro文件。如果src目录本身包含了一个.pro文件,那么qmake会处理这个文件。
如果src目录中还包含其他子目录,并且这些子目录中也有.pro文件,那么这些.pro文件不会自动被qmake处理,除非它们也被明确地添加到了SUBDIRS变量中。但是,一般顶层.pro文件包含的子目录中只包含1个.pro文件,即:项目纵深只有2层。因为,纵深越大,这样会使项目的构建过程变得更加复杂和难以维护。因此,在大多数情况下,项目纵深只有2层,在顶层.pro中建议显式地列出所有需要构建的子项目。
【2】除了包含子目录名,SUBDIRS还可以指定子目录中的pro文件 。这样,你可以构建多个项目或项目的一部分,将它们组织在Qt的项目管理系统中。
相关文章:
Qt pro文件详解
概述 在Qt中,.pro 文件(也称为项目文件)是Qt项目管理系统(qmake)所使用的配置文件。这个文件定义了如何构建你的Qt应用程序或库,其使用简单的键值对语法,允许你指定源文件、头文件、库依赖、配置…...

JavaFX布局-ButtonBar
JavaFX布局-ButtonBar 常用属性buttonOrderpaddingbuttonMinWidth 实现方式Java实现fxml实现 一个特殊的容器,用于创建一组按钮,水平排列按钮太多,会被遮住,不会自动产生滚动条 常用属性 buttonOrder 预制顺序 buttonBar.setBut…...

【C++程序设计】——利用数组处理批量数据(二)
👨💻个人主页:开发者-削好皮的Pineapple! 👨💻 hello 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 削好皮的Pineapple! 原创 👨Ǵ…...

使用 1panel面板 部署 php网站
代码仓库:https://github.com/talmudmaster/RedCorpus 目录 网站介绍安装步骤1. 准备云服务器2. 准备域名(可跳过)3. 安装1panel面板4. 服务器开放端口5. 进入1panel面板6. 安装并启动软件(服务器和面板开放端口)7. 创…...

Windows调大虚拟内存来代替升级物理运行内存(RAM)真的有用吗?
前言 前段时间有个粉丝突发奇想说:电脑运行内存不足,调大虚拟内存来代替升级物理运行内存(内存条)不就可以了?剩下的大几百块钱吃香的喝辣的不好吗? 嗯。。。直到2024年的今天,估计还有很多小…...

[Unity] ShaderGraph实现DeBuff污染 溶解叠加效果
本篇是在之前的基础上,继续做的功能衍生。 [Unity] ShaderGraph实现Sprite消散及受击变色 完整连连看如下所示:...
java算法day28
java算法day28 300 最长递增子序列136 只出现一次的数字169 多数元素234 回文链表53 最大子数组和 300 最长递增子序列 这个是记忆化搜索的代码。是从递归改过来的。 这题显然是要用dp做比较合适。因为很容易看到原问题与子问题之间的关系。 还是从后往前看。 然后可以利用选…...
vue实现歌词滚动效果
1.结构 <template><div class"lyricScroll"><div class"audio"><audio id"audio" src"./common/周传雄-青花1.mp3" controls></audio></div><div class"container" id"contai…...

【算法设计题】合并两个非递减有序链表,第1题(C/C++)
目录 第1题 合并两个非递减有序链表 得分点(必背) 题解 函数声明与初始化变量: 初始化合并链表的头节点: 合并两个链表: 处理剩余节点: 返回合并后的链表: 完整测试代码 🌈…...

Vue前端工程
创建一个工程化的vue项目 npm init vuelatest 全默认回车就好了 登录注册校验 //定义数据模型 const registerDataref({username:,password:,rePassword: }) //校验密码的函数 const checkRePassword(rule,value,callback)>{if (value){callback(new Error(请再次输入密…...

什么是药物临床试验?
药物临床试验是指在人体上进行的新药试验研究,旨在确定新药的疗效、安全性、药代动力学和药效学。临床试验不仅帮助确认药物是否对特定疾病或症状有效,还帮助识别和评估药物的副作用和风险。 药物临床试验(Clinical Trial,CT&…...

编译和汇编的区别
一、编译 编译是将高级语言(如C、C、Java等)编写的源代码转换成计算机可以直接执行的低级语言(通常是机器语言或汇编语言)的过程 编译 —— 将人类可读的源代码转换为计算机可执行的指令集 编译过程 通常包括词法分析、语法分…...

C# 设计倒计时器、串口助手开发
文章目录 1. 实现一个简单的倒计时器开始、暂停2. 串口助手开发 1. 实现一个简单的倒计时器开始、暂停 namespace Timer {public partial class Form1 : Form{int count;//用于定时器计数int time;//存储设定的定时值bool parse false;//控制暂停计时public Form1(){Initiali…...

图论① dfs | Java | LeetCode 797,Kama 98 邻接表实现(未完成)
797 所有可能路径 https://leetcode.cn/problems/all-paths-from-source-to-target/description/ 输入:graph [[1,2],[3],[3],[]] 题目分析,这里 class Solution {//这个不是二维数组,而是listList<List<Integer>> res new Ar…...

Mac安装nvm以及配置环境变量
安装nvm brew install nvm安装成功后会出现这样一段话: Add the following to your shell profile e.g. ~/.profile or ~/.zshrc:export NVM_DIR"$HOME/.nvm"[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh&q…...

AUTOSAR实战教程-使用DET来发现开发错误
2年之前因为在调试AUTOSAR存储协议栈的时候使用DET并没发现有用的信息,所以就武断下结论--这玩意没有用。活到老学到老吧,bug经历的多了,发现这玩意还挺有用的。说一下这个bug的背景。 在将时间同步报文改道CanTsync之后,由于这个AUTOSAR工具本身的问题以及配置工程师本身的…...
ZeroMQ(二):请求-响应模式,C和C++。
目录 请求响应基础 基本概念 工作流程 典型应用 请求-响应模式的特点 应用实例 优点 缺点 ZEROMQ C语言 2.1 服务器端代码(Reply Server) 2.2 客户端代码(Request Client) 3. 编译代码 4. 详细说明 ZEROMQ C 1. …...

【虚拟仿真】Unity3D中实现2DUI显示在3D物体旁边
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 这篇文章来实现2DUI显示在3D物体旁边,当我们需要在3D模型旁边显示2DUI的时候,比如人物的对…...

代码随想录 day 29 贪心
第八章 贪心算法 part03 134. 加油站 本题有点难度,不太好想,推荐大家熟悉一下方法二 https://programmercarl.com/0134.%E5%8A%A0%E6%B2%B9%E7%AB%99.html 135. 分发糖果 本题涉及到一个思想,就是想处理好一边再处理另一边,不…...

开源:LLMCompiler高性能工具调用框架
开源:LLMCompiler高性能工具调用框架 LLMCompilerLLMCompiler 框架图任务提取单元使用方式参考链接 LLMCompiler LLMCompiler 是一种 Agent 架构,旨在通过在DAG中快速执行任务来加快 Agent 任务的执行速度。它还通过减少对 LLM 的调用次数来节省 Tokens …...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...