当前位置: 首页 > 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…...

都说00后已经躺平了,但是有一说一,该卷的还是卷啊。

这不&#xff0c;三月份春招我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪20K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里条件不太好&…...

牛客网刷题学习SQL(二)

SQL22 统计每个学校的答过题的用户的平均答题数 描述 运营想要了解每个学校答过题的用户平均答题数量情况&#xff0c;请你取出数据。 用户信息表 user_profile&#xff0c;其中device_id指终端编号&#xff08;认为每个用户有唯一的一个终端&#xff09;&#xff0c;gender指…...

深蓝学院 C++笔记 先导篇章 - 绪论

一、介绍-老师寄语 为什么选择C&#xff1f; 高性能解决问题 二、C推荐书目 1. 基础 《C Primer》&#xff0c;Stanley B. Lippman 等著&#xff0c;王刚、杨巨峰等译 2. 进阶 《Effective C》&#xff0c;Scott Meyers 著&#xff0c;侯捷译。 《More Effective C》&am…...

R7-19 天梯赛团队总分

“天梯赛”的竞赛题目一共有 15 道&#xff0c;分为 3 个梯级&#xff1a; 基础级设 8 道题&#xff0c;其中 5 分、10 分、15 分、20 分的题各 2 道&#xff0c;满分为 100 分&#xff1b;题目编号相应为L1-X&#xff0c;X取1,2,3,4,5,6,7,8&#xff0c;分别表示基础级的8道题…...

使用 Kotlin 的 Opt-in (选择加入)功能注解API提示当前非稳定API

前言 之前在给公司项目封装库的时候&#xff0c;领导告诉我封装的漂亮一点&#xff0c;等以后公司发展起来了可能需要把这个库提供给第三方接入使用。 此时&#xff0c;就有这么一个问题&#xff1a;某些功能函数使用条件比较苛刻&#xff0c;直接使用可能会出现意想不到的后…...

webpack配置排除打包

webpack配置排除打包 思路 打包时&#xff0c;不要把类似于element-ui第三方的这些包打进来 从网络上&#xff0c;通过url地址直接引入这些包 操作 &#xff08;1&#xff09;先找到 vue.config.js&#xff0c; 添加 externals 项&#xff0c;具体如下&#xff1a; config…...

HNU-操作系统OS-ucoreLab系列-感悟

谨以此片篇,献给熬夜的8个晚上,以及逝去的时光。 感悟: 今天结束了所有的Lab实验(2023.6.3),感慨万千。 喜是这个实验终于结束了,悲是其实有好多地方我都没有理解。 应该指出,由于验收的助教学长学姐们的宽容,HNU实际上在验收这一块的要求还是比较低的。 但是这个…...

MySQL运维篇(三)

五.读写分离 5.1 介绍 读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作&#xff0c;从数据库提供读操作&#xff0c;这样能有效地减轻单台数据库的压力。 通过MyCat即可轻易实现上述功能&#xff0c;不仅可以支持MySQL&#x…...

Lecture 2 Text Preprocessing

目录 Some DefinitionsReasons for PreprocessingPreprocessing StepsSentence Segmentation 句子分割Binary Classifier 二元分类器Word Tokenization: English 英文词元标记化Word Tokenization: Chinese 中文词元标记化Word Tokenization: German 德语词元标记化Subword Tok…...

web练习第二周

前言&#xff1a;&#xff08;博主个人学习笔记&#xff0c;不用看&#xff09;web练习第二周&#xff0c;仅做出前3题。相比于第一周&#xff0c;难度大幅增加&#xff0c;写题时就算看了wp还是像个无头苍蝇一样到处乱创&#xff0c;大多都是陌生知识点&#xff0c;工具的使用…...