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

Qt 项目文件Pri详解

在Qt项目中,pri文件(.pri)是一种类似于makefile的文件,用于定义Qt项目中的编译规则。通常可以用pri文件来配置Qt库、头文件、源文件、链接库等信息,这样可以把这些信息定义在一个文件中,避免在每个工程中都进行重复配置,提高了代码的可重用性。

对于Qt项目来说,pri文件是非常重要的,因为它可以方便地进行模块管理,让工程的结构更加清晰。如果你需要在Qt项目中添加新的模块或者新的第三方库,你可以在pri文件中添加相关的信息。同时,pri文件还可以使代码编译更高效,这是因为它会根据不同平台自动选择最优化的编译器和编译选项。

在使用pri文件时,你应该学会如何编写和使用自己的pri文件,以便能够根据自己的需要进行自定义配置。同时,你也可以将已经写好的pri文件分享给其他人使用,以提高整个团队的开发效率。在Qt Creator编辑器中,可以通过右键单击项目文件夹,选择“Add New...”菜单,选择“Add Existing Files or Directory...”,然后选择对应的pri文件添加到项目中。

需要注意的是,pri文件虽然非常强大,但同时也需要谨慎使用。如果错误地配置pri文件,会导致代码无法正常编译运行,因此在修改pri文件时一定要慎重。

一、Pri文件简介

在Qt中,Pri文件是一种项目文件,用于将C++代码、JavaScript文件、资源文件等链接在一起,并生成可执行文件。Pri文件中可以定义编译规则、链接规则、生成规则、部署规则等等,通过使用不同的变量和函数,来实现各种复杂的构建流程和部署流程。

Pri文件是基于Makefile语法的,因此需要使用一定的Makefile知识。同时,Qt Creator集成开发环境及其命令行工具Qt Build System(qbs)可以方便地生成Pri文件并进行构建,使得在不需要编写完整的Makefile的情况下进行快速开发和构建成为可能。

二、Pri文件编写基础

Pri文件的编写离不开变量、函数和条件判断等基础语法。

1. 变量的定义

Pri文件中的变量可以是预定义的系统变量,如$$PWD表示Pri文件所在的目录;也可以是用户自定义的变量,如SRC_DIR表示源文件目录。变量定义的语法是:

VARIABLE_NAME = variable_value

其中,VARIABLE_NAME为变量名,variable_value为变量的值。在变量的值中,可以嵌入其他变量,例如:

SRC_DIR = $$PWD/src
OBJ_DIR = $$PWD/obj
OBJECTS_DIR = $$OBJ_DIR/$$TARGET

其中,$$TARGET表示生成文件的目标类型,可以是exe、dll、plugin等。

2. 函数的使用

Pri文件中的函数可以大大简化复杂的构建流程,例如文件搜索、文件生成、文件拷贝、库链接等等。

函数的语法是:

FUNCTION_NAME(arg1, arg2, ...)

其中,FUNCTION_NAME为函数名,arg1、arg2等为函数的参数。常用的函数包括:

  • files:用于搜索指定目录下的所有文件
  • subdirs:指定当前目录下的子目录
  • target.sources:为目标文件指定源文件
  • target.depends:指定目标文件所依赖的文件
  • target.commands:为目标文件指定编译命令、链接命令等
  • target.path:指定目标文件生成的路径
  • target.link:为目标文件指定需要链接的库文件以及链接命令等

例如:

LIBS += -lfoo
target_link($$TARGET, $$LIBS)

其中,target_link是一个自定义的函数,用于将$$LIBS中指定的库链接到$$TARGET中。

3. 条件判断

在Pri文件中,可以根据具体情况对不同的操作进行条件判断,例如:

win32:LIBS += -lwsock32
else:LIBS += -lsocket -lnsl

其中,win32表示在Windows平台下进行操作,else表示在其他平台下进行操作。

三、Pri文件高级应用

在掌握了基础的Pri文件语法之后,Pri文件可以进行更多复杂的编译任务。

1. 如何指定编译器

在Pri文件中,可以通过设置QMAKE_CXX和QMAKE_CC变量来指定编译器:

QMAKE_CXX = g++
QMAKE_CC = gcc

2. 如何生成动态库和静态库

在Pri文件中,可以通过target.commands指定动态库和静态库的生成规则:

lib.path = /usr/lib
lib.name = foo
lib.files = source1.cpp source2.cpp
lib.commands = $$QMAKE_CXX -shared -o $$lib.target $$OBJECTS

其中,lib.path指定库文件生成的路径,lib.name指定库文件的名称,lib.files指定库文件的源文件,lib.commands指定库文件的生成命令。

3. 如何生成可执行文件和文件拷贝

可执行文件和文件拷贝的生成规则如下:

executable.output = foo
executable.files = source1.cpp source2.cpp
executable.commands = $$QMAKE_CXX -o $$executable.target $$OBJECTS
INSTALLS += exe
exe.target = /usr/bin
exe.files = $$executable.target
exe.commands = $$QMAKE_COPY $$executable.target $$exe.target

其中,executable.output指定可执行文件的名称,executable.files指定可执行文件的源文件,executable.commands指定可执行文件的生成命令。INSTALLS指定生成文件的部署规则,exe.target指定部署目标目录,exe.files指定需要部署的文件,exe.commands指定文件拷贝的命令。

四、Pri文件的使用案例

以下是一个简单的Pri文件的示例:

SRC_DIR = $$PWD/src
OBJ_DIR = $$PWD/obj
TARGET_DIR = $$PWD/binINCLUDEPATH += $$PWD/include
LIBS += -ldltarget.path = $$TARGET_DIR
target.name = myappmessage(Building ... $$TARGET)
message(Source files: $$SOURCES)contains(CONFIG, debug) {message(Building in debug mode...)TARGET = myappdCOMMON_FLAGS = -g -O0
}contains(CONFIG, release) {message(Building in release mode...)TARGET = myappCOMMON_FLAGS = -O2
}sources = $$files($$SRC_DIR/*.cpp)target.sources = $$sourcesOBJECTS_DIR = $$OBJ_DIR/$$TARGETmocable_headers = $$_PRO_FILE_PWD_/input.h
mocables = $$mocable_headers
mocables.headers = $$mocable_headers
mocables.commands = $$QTDIR/bin/moc $$mocables.headers -o $$mocables.targetQMAKE_EXTRA_TARGETS += mocablesunix {target.commands = $$QMAKE_CXX -o $$TARGET $$OBJECTS $$LIBSmocables.target = $${OBJECTS_DIR}/input.mocmkdir($${OBJECTS_DIR})
} else {target.commands = link -out:$$TARGET.exe $$OBJECTS $$LIBSmocables.target = $${OBJECTS_DIR}/input.moc.objmkdir($$system_path($${OBJECTS_DIR}))
}target.dependency_type = TYPE_Ctarget.CONFIG += dll
target.LIBS += -lfooDISTFILES += $$PWD/post_install_scriptmocables.CONFIG += no_link_targetINSTALLS += target mocables
target.files = $$TARGET
mocables.files = $${mocable_headers}

其中,该Pri文件实现了基本的编译和部署任务,具体实现方式如下:

  • 定义了SRC_DIR、OBJ_DIR、TARGET_DIR三个变量,用于指定源文件目录、目标文件目录和可执行文件目录。
  • 指定了头文件搜索路径和库文件搜索路径。
  • 定义了BUILD_MODE变量,用于指定构建模式,debug或release。
  • 根据BUILD_MODE的设置,确定了可执行文件的名称,以及编译选项。
  • 依据源文件目录下的所有.cpp文件,为目标文件指定源文件。
  • 指定了需要运行moc预编译器的头文件,用于生成mocable文件。
  • 指定了可执行文件的链接库、库文件等。
  • 配置了可执行文件的部署规则。

通过这个简单的Pri文件,我们可以看到Qt Pri的强大和方便。在实际开发中,Pri文件可以根据需求定制,支持多库编译、多平台编译、资源文件编译等等,大大提高了开发效率。

相关文章:

Qt 项目文件Pri详解

在Qt项目中,pri文件(.pri)是一种类似于makefile的文件,用于定义Qt项目中的编译规则。通常可以用pri文件来配置Qt库、头文件、源文件、链接库等信息,这样可以把这些信息定义在一个文件中,避免在每个工程中都进行重复配置&#xff0…...

Keil 5 MDK 发律师函警告了,如何用STCubeIDE开发标准库的程序(STM32F103C8T6为例)

用STCubeIDE进行标准库开发 1、CubeIDE介绍 https://www.stmcu.com.cn/ecosystem/Cube/STM32CubeIDE 2、CubeIDE下载 点击上面的链接,登录即可下载 3、搭建Demo工程 新建一个工作空间 创建一个工程 选择芯片-STM32F103C8T6 填写工程信息 添加标准库到工程 标…...

接口测试--apipost接口断言详解

在做接口测试的时候,会对接口进行断言,一个完整的接口测试,包括:请求->获取响应正文->断言。 一、apipost如何进行断言 apipost的断言设置实在后执行脚本中进行编写的。apipost本身提供了11中断言: apt.asser…...

YYDS练手 130道python练习题 完整版PDF

近年来,Python在编程语言界里赚足了风头,无论是受欢迎程度,还是薪资待遇,都非常可观,相应的,Python岗位要求也越来越高,无论你是零基础还是老前辈,在Python面试中都不能轻视。 不打…...

2-python的变量类型

内容提要 主要回顾了python中的变量类型,区分它们和c中的区别 python中的数字没有long python中的字符串不能被改变,也就是说不能对其内字符元素进行赋值操作 python中列表的数据类型与c访问方式有一定的区别列表的下标可以是负数,无论正负&…...

Python之并发编程一背景知识

一、开篇介绍 顾名思义,进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展…...

Redis分区

分区 Redis是单线程的,如何提高多核CPU的利用率? 可以在同一个服务器部署多个Redis的实例,并把他们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的, 所以,如果你想使用多个CPU&…...

代码随想录算法训练营第56天 | 583、72

583. 两个字符串的删除操作 题目描述 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 示例1: 输入: w o r d 1 " s e a " , w o r d 2 " e a t …...

c++输入输出文件操作stream

系列文章目录 C IO库 文章目录 系列文章目录前言一、文件IO概述coutcin其他istream类方法 文件输入和输出内核格式化总结 前言 一、文件IO 概述 c程序把输入和输出看作字节流。输入时,程序从输入流中抽取字节:输出时,程序将字节流插入到输…...

【小呆的力学笔记】非线性有限元的初步认识【三】

文章目录 1.2.2 基于最小势能原理的线性有限元一般格式1.2.2.1 离散化1.2.2.2 位移插值1.2.2.3 单元应变1.2.2.4 单元应力1.2.2.5 单元刚度矩阵1.2.2.6 整体刚度矩阵1.2.2.7 处理约束1.2.2.8 求解节点载荷列阵1.2.2.9 求解位移列阵1.2.2.10 计算应力矩阵等 1.2.2 基于最小势能原…...

python计算闰年

这里说明一下:看到网上很多写python计算闰年的,有很多是不同。 有份省级期刊万年历计算公元1-10000年的闰年 算法如下:4000年停闰一次。区别其他算法,有些是3200年停闰一次。 def division(dividend, divisor) -> bool:"…...

聊聊如何使用Js写一个简单的二级联动和三级联动呢?

前言:咳咳哈,大佬说:"这不是有手就行了?"好吧,这里不做过多罗里吧嗦,真的不过多吹,我们在下面直接上代码上注释。 文章目录: 原Js二级联动实现原Js三级联动实现 一、二级…...

IPv4 和 IPv6 的特点、区别以及在互联网中的应用

在当今互联网时代,IP 地址是连接和通信的基础。IPv4(Internet Protocol version 4)和 IPv6(Internet Protocol version 6)是两种常见的 IP 地址版本。IPv4 是最早广泛使用的 IP 地址协议,而 IPv6 则是 IPv4…...

JavaScript处理移动web交互

touch对象和touchevent touch事件 touch对象 每一次发生touch事件时就会产生一个touch对象&#xff0c;类似事件处理函数中的事件对象。 <div class" "><button class"child" style"height: 400px; width: 400px">我是按钮</b…...

4年测试经验,一问三不知,过于离谱...

公司今年要招人&#xff0c;面倒是面了很多测试&#xff0c;但没有一个合适的。一开始想要的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;当然来了更好&#xff0c;提供的薪资在10-20k,来面试的人有很多&#xff0c;但平均水准真的是让人失望。 看简历时很多都写着3…...

Java 与查找算法(2)二分查找

一、二分查找 二分查找&#xff0c;也称折半查找&#xff0c;是一种常见的查找算法。它的思想是将有序数组分成两部分&#xff0c;取中间位置的值与目标值进行比较&#xff0c;如果相等则返回该位置&#xff0c;如果目标值小于中间值&#xff0c;则在左半部分继续查找&#xf…...

Java程序设计入门教程--原始类与包装类

包装类 Java语言是一个面向对象的语言&#xff0c;但是Java中的基本数据类型却是不面向对象的&#xff0c;这在实际使用时存在很多的不便。 为了解决这个不足&#xff0c;在设计类时为每个基本数据类型设计了一个对应的类进行代表&#xff0c;这样八个和基本数据类型对应的类统…...

pip安装python库速度慢、失败及超时报错解决办法

背景&#xff1a; 随着人工智能的不断兴起&#xff0c;python作为最接近人工智能的语言&#xff0c;变得越来越流行&#xff0c;人生苦短&#xff0c;python要学起来。之所以越来用的人喜欢学习python和研究Python&#xff0c;除了python本身便于学些、语法简短、面向对象等特点…...

向量数据库

向量数据库可以做哪些事情 存储和索引向量检索相似向量&#xff0c;还具有过滤功能自动将文档转变成向量&#xff0c;所以会自动化分词、向量化、索引等操作 目前存在的向量数据库&#xff1a; 名称github开源协议chromahttps://github.com/chroma-core/chromaApache 2.0Mil…...

leetcode 11.盛最多水的容器

题目描述 跳转到leetocde题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff…...

AI手势识别与追踪:Android端5分钟快速集成教程(附彩虹骨骼效果)

AI手势识别与追踪&#xff1a;Android端5分钟快速集成教程&#xff08;附彩虹骨骼效果&#xff09; 1. 引言 1.1 手势识别的价值 想象一下&#xff0c;不用触碰屏幕就能控制手机——这不是科幻电影&#xff0c;而是AI手势识别技术带来的真实体验。从智能家居控制到AR游戏交互…...

基于S7-1200PLC的物业供水控制系统设计》 PLC触摸屏,图纸,博图16 一、设计任务书...

基于S7-1200PLC的物业供水控制系统设计》 PLC触摸屏&#xff0c;图纸&#xff0c;博图16 一、设计任务书 1.自动工作时&#xff0c;当用水量少&#xff0c;压力增高&#xff0c;K 接通&#xff0c;此时可延时30s后撤除1台水泵工作,要求先工作的水泵先切断;当用水量多时,压力降低…...

Linux时钟子系统:CCF框架与驱动开发实践

1. Linux时钟子系统概述在嵌入式Linux系统中&#xff0c;时钟管理是驱动开发的基础环节之一。时钟子系统负责为整个系统提供精确的时序控制&#xff0c;从CPU主频到外设工作时钟&#xff0c;都需要通过时钟子系统进行管理和配置。Linux内核通过CCF&#xff08;Common Clock Fra…...

CherryStudio+Obsidian联动指南:如何让本地笔记成为大模型的长期记忆?

CherryStudio与Obsidian深度整合&#xff1a;构建AI可理解的长期记忆系统 在信息爆炸的时代&#xff0c;我们每天都在产生大量笔记和知识片段&#xff0c;但这些内容往往沉睡在本地文件中&#xff0c;无法与智能工具形成有效互动。Obsidian以其独特的网状笔记结构和本地Markdow…...

别再让AI瞎猜了!手把手教你为项目创建AGENTS.md文件(附Turbo monorepo实战模板)

别再让AI瞎猜了&#xff01;手把手教你为项目创建AGENTS.md文件&#xff08;附Turbo monorepo实战模板&#xff09; "AI生成的代码又跑偏了&#xff01;"——这可能是现代开发者最常遇到的挫败场景之一。当你在Turborepo管理的monorepo中工作时&#xff0c;AI助手可…...

新手福音:在快马平台交互式学习openclaw更新命令语法与参数

作为一名刚接触openclaw的新手&#xff0c;我最初看到那些复杂的命令行参数时简直一头雾水。直到发现了InsCode(快马)平台&#xff0c;它用可视化的方式帮我拆解了openclaw更新命令的每个细节&#xff0c;现在终于能自信地操作了。下面分享我的学习心得&#xff1a; 命令结构拆…...

Acetic Acid-PEG-OPSS,分子链两端分别带有吡啶基二硫化物和乙酸基团

一.名称英文名称&#xff1a;AA-PEG-OPSS&#xff0c;Acetic Acid-PEG-OPSS&#xff0c;OPSS-PEG-AA&#xff0c;OPSS-PEG-Acetic Acid中文名称&#xff1a;乙酸聚乙二醇二巯基吡啶&#xff0c;乙酸PEG二巯基吡啶分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&#xff0…...

Optisystem仿真案例5-三种调制格式的FSO空间自由光通信系统 内容:搭建了OOK、P...

Optisystem仿真案例5-三种调制格式的FSO空间自由光通信系统 内容&#xff1a;搭建了OOK、PPM、BPSK基本结构的三种调制格式的FSO空间自由光通信系统 形式&#xff1a;程序&#xff0b;附带解析 最近在搞FSO通信仿真&#xff0c;试了三种不同的调制格式——OOK、PPM、BPSK&…...

OpenClaw技能扩展:安装Qwen3-4B专用插件实现代码生成

OpenClaw技能扩展&#xff1a;安装Qwen3-4B专用插件实现代码生成 1. 为什么需要Qwen3-4B专用技能 作为一个长期与代码打交道的开发者&#xff0c;我一直在寻找能够提升编码效率的工具。当我第一次接触OpenClaw时&#xff0c;最吸引我的不是它的基础自动化能力&#xff0c;而是…...

Oracle 数据库中的 REF 类型与触发器的使用

在 Oracle 数据库中,引用类型(REF)是对象类型之间关联的一种强大工具。特别是在复杂的企业应用中,REF 类型可以帮助我们建立对象间的引用关系,模拟现实世界的关系模型。本文将通过一个实际的例子,介绍如何在 Oracle 中使用 REF 类型,以及如何通过触发器(Trigger)来确保…...