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 …...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...
