Qt 中的多项目管理

news2025/2/3 9:13:33

背景:

在Visual Studio中使用 “Solution” 来组织多个 Projects。

在Qt中,使用 "Subdirs Project"来组成多个projects ,实现VS中的Solution功能。

项目类型

首先是先新建一个子目录项目,再根据需要在子目录项目中添加一个应用程序项目以及多个库的项目,子目录项目默认就只有一个.pro文件。
在这里插入图片描述
“subdirs”模板告诉qmake生成一个makefile,它可以进入到特定子目录并为这个目录中的项目文件生成makefile并且为它调用make。

在这个模板中只有一个系统变量SUBDIRS可以被识别。这个变量中包含了所要处理的含有项目文件的子目录的列表。这个项目文件的名称是和子目录同名的,这样qmake就可以发现它。例如,如果子目里是“MainApp”,那么在这个目录中的项目文件应该被叫做MainApp.pro

在这里插入图片描述

.pro文件配置

选项说明
TEMPLATE模板变量告诉qmake为这个应用程序生成哪种makefile。
CONFIG指定编译器选项和项目配置,值由qmake内部识别并具有特殊意义。
DEFINESqmake添加这个变量的值作为编译器C预处理器宏(-D选项)。
INCLUDEPATH指定编译项目时应该被搜索的#include目录。
DEPENDPATH指定程序编译时依赖的相关路径。
DESTDIR指定在何处放置目标文件。
TARGET指定目标文件的名称。默认情况下包含的项目文件的基本名称。
OUT_PWD指定构建目录。
MOC_DIR指定来自moc的所有中间文件放置的目录(含Q_OBJECT宏的头文件转换成标准.h文件的存放目录)。
OBJECTS_DIR指定所有中间文件.o(.obj)放置的目录。
RCC_DIR指定Qt资源编译器输出文件的目录(.qrc文件转换成qrc_*.h文件的存放目录)。
LIBS指定链接到项目中的库列表。-L后是库文件的目录,-l后是具体的库的名字(后缀不用加)。
例如:LIBS += -L$$PWD/../../../ThirdLib/winapi -lWSock32
RC_ICONS仅适用于Windows,指定的图标应该包含在一个生成的.rc文件里。如果RC_FILE 和RES_FILE变量都没有设置这才可利用。
TRANSLATIONS指定包含用户界面翻译文本的翻译(.ts)文件列表。

TEMPLATE 配置项

选项说明
app创建一个用于构建应用程序的Makefile(默认)。
lib创建一个用于构建库的Makefile。
subdirs创建一个用于构建目标子目录的Makefile,子目录使用SUBDIRS变量指定。
aux创建一个不建任何东西的Makefile。如果没有编译器需要被调用来创建目标,比如你的项目使用解释型语言写的,使用此功能。注:此模板类型只能用于Makefile-based生成器。特别是,它不会工作在vcxproj和Xcode生成器。
vcapp仅适用于Windows。创建一个Visual Studio应用程序项目。
vclib仅适用于Windows。创建一个Visual Studio库项目。

CONFIG 配置项

以下配置值控制编译标志:

选项说明
release项目以release模式构建。如果也指定了debug,那么最后一个生效。
debug项目以debug模式构建。
debug_and_release项目准备以debug和release两种模式构建。
debug_and_release_target此选项默认设置。如果也指定了debug_and_release,最终的debug和release构建在不同的目录。
build_all如果指定了debug_and_release,默认情况下,该项目会构建为debug和release模式。
autogen_precompile_source自动生成一个.cpp文件,包含在.pro中指定的预编译头文件。
ordered使用subdirs模板时,此选项指定应该按照目录列表的顺序处理它们。
precompile_header可以在项目中使用预编译头文件的支持。
warn_on编译器应该输出尽可能多的警告。如果也指定了warn_off,最后一个生效。
warn_off编译器应该输出尽可能少的警告。
exceptions启用异常支持。默认设置。
exceptions_off禁用异常支持。
rtti启用RTTI支持。默认情况下,使用编译器默认。
rtti_off禁用RTTI支持。默认情况下,使用编译器默认。
stl启用STL支持。默认情况下,使用编译器默认。
stl_off禁用STL支持。默认情况下,使用编译器默认。
thread启用线程支持。当CONFIG包括qt时启用,这是缺省设置。
c++11启用c++11支持。如果编译器不支持c++11这个选项,没有影响。默认情况下,支持是禁用的。
c++14启用c++14支持。如果编译器不支持c++14这个选项,没有影响。默认情况下,支持是禁用的。

平台相关性处理

为Windows平台加的依赖平台的文件的简单的作用域看起来就像这样:
win32 { SOURCES += hello_win.cpp }

子项目 .pro文件

每次添加一个子项目就会在SUBDIRS项目加上一个项目名,子目录项目的TEMPLATE = subdirs
CONFIG += ordered是让项目按照顺序编译,由于主程序依赖于对应的库,一般都是把MainApp放在SUBDIRS的最后。

主程序pro文件

主程序的TEMPLATE = app。除了常规的 pro 设置外,要记得将自己编的库的头文件目录加上,并将生成的 dll 通过LIBS链接:

#library
INCLUDEPATH += \
    $$PWD/../../Libraries \

LIBS += \
    -L$$DESTDIR -lComponent -lcommonLibs \

库pro文件

库的TEMPLATE = lib。库在通过Creator新建的时候会生成一个xxx_global.h,定义了导出库的相关信息:

#include <QtCore/qglobal.h>

#if defined(TESTLIB_LIBRARY)
#  define TESTLIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define TESTLIBSHARED_EXPORT Q_DECL_IMPORT
#endif

在库中要作为接口的类记得加上对应的宏:
class TESTLIBSHARED_EXPORT TestLib : public QObject
静态库貌似不需要这个,待测试…

.pri文件

对于一些库和主程序都需要的目录设置 (构建目录、obj生成目录、moc文件生成目录等),可以统一写在一个 pri 文件中:

CONFIG(release, debug|release) {
    BuildType=release
    CONFIG += warn_off
} else {
    BuildType=debug
    DEFINES += __DEBUG
}

INTERMEDIATE_DIR = $$PWD/../Intermediate/$$BuildType

DESTDIR         = $$PWD/../RunImage/$$BuildType
OUT_PWD         = $$INTERMEDIATE_DIR/$$TARGET
MOC_DIR         = $$INTERMEDIATE_DIR/$$TARGET
OBJECTS_DIR     = $$INTERMEDIATE_DIR/$$TARGET
RCC_DIR         = $$INTERMEDIATE_DIR/$$TARGET
UI_DIR          = $$INTERMEDIATE_DIR/$$TARGET

在需要引用的pro文件中:

include($$PWD/../../../Path.pri)

查看变量信息

message($$INCLUDEPATH), 会在概要信息中打印相关变量的值


实践操作(如何使用QMake的 subdirs模板?)

创建Subdirs类型的工程

在这里插入图片描述

添加子工程

添加的子工程可以是.exe类型的,也可以是.dll类型的。
在这里插入图片描述

子工程的相互引用

.exe工程通常需要引用其他.dll类型的工程,步骤如下。

  1. 右击工程(例如.exe工程),选择“Add Library…”。
    在这里插入图片描述

  2. 选择“Internal Library”,即选择在同一个solution(编译树)下的库。这会把库文件和头文件的路径添加到.pro文件中。
    在这里插入图片描述

  3. 选择要引用的库对应的工程(在同一个solution下)
    在这里插入图片描述

  4. Qt会自动往.pro文件中添加引用库的库文件&头文件的路径和文件名。
    在这里插入图片描述
    (指定LIBS库文件的路径和名称,指定#include文件的路径,指定依赖项的路径)。

深入了解:

Subdirs工程自身只有一个.pro文件,如下图所示。除了 “TEMPLATE=subdirs”,

“SUBDIRS”后面列出了该subdirs包含的所有工程,编译顺序按工程列出的书序进行。下图中先编译funDll,然后是mydll,最后是subWidgets。

参考资料
Qt之pro配置详解
QT中PRO文件写法的详细介绍
QT中的Solution-Subdirs Project

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

漏洞深度分析|CVE-2022-1471 SnakeYaml 命令执行漏洞

项目介绍 YAML是一种数据序列化格式&#xff0c;设计用于人类的可读性和与脚本语言的交互。 SnakeYaml是一个完整的YAML1.1规范Processor&#xff0c;支持UTF-8/UTF-16&#xff0c;支持Java对象的序列化/反序列化&#xff0c;支持所有YAML定义的类型。 项目地址 https://gi…

javaee之MyBatis框架3

mybatis中编写dao实现类的使用方式 简单说一下实现原理&#xff1a; 下面来说一下UserDaoImpl的实现原理 mybatis主配置文件中properties标签的使用 第一种&#xff1a; <property name"driver" value"com.mysql.jdbc.Driver"></property> &…

软件加密保护:Mirage License Protector v5 注册版

Mirage License Protector v5.1.0 适用于许多编译器 License Protector 是一个 DLL / COM exe&#xff0c;几乎可以与 所有编译器一起使用&#xff1a;C、C#、.NET、Delphi、VB6 和 VB.NET&#xff0c; 32 位和 64 位的 Java 哪种产品适合我&#xff1f; 选择许可证保护器 应…

智能无障碍轮椅——PID算法控制

文章目录一、PID算法二、控制方法对比棒棒控制&#xff08;启停控制器&#xff09;比例控制PI控制PID控制三、PID的手动整定四、PID衰减曲线整定五、PID调节器各校正环节的作用是&#xff1a;六、PID算法的一般表达式是&#xff1a;七、计算注意事项一、PID算法 PID控制是最早…

图像语义分割网络FCN(32s、16s、8s)原理及MindSpore实现

一、FCN网络结构 全卷积网络(Fully Convolutional Networks)&#xff0c;是较早用于图像语义分割的神经网络。根据名称可知&#xff0c;FCN主要网络结构全部由卷积层组成&#xff0c;在图像领域&#xff0c;卷积是一种非常好的特征提取方式。本质上&#xff0c;图像分割是一个分…

DBCO-PEG-NH2/Amine二苯基环辛炔-聚乙二醇-氨基 简介。用于以高特异性和反应性标记叠氮化物修饰的生物分子。

中文名称&#xff1a; 二苯基环辛炔-聚乙二醇-氨基 氨基-聚乙二醇-二苯基环辛炔 英文简称&#xff1a; DBCO-PEG-NH2/Amine Amine/H2N-PEG-DBCO 外观&#xff1a; 灰白色固体或半固体&#xff0c;取决于PEG的分子量 溶剂&#xff1a; 部分常规有机溶剂 存储…

day20-django

文件上传 批量上传数据 案例&#xff1a;混合数据(Form) 提交页面&#xff1a;用户输入数据文件&#xff08;输入不能为空&#xff0c;报错&#xff09; django开发过程中两个特殊的文件夹 static&#xff1a;存放静态文件的路径&#xff0c;包括css、js、项目图片 media&…

【问题记录】Git问题记录

文章目录问题1Failed to connect to github.com port 443 after 21085 ms: Timed outOpenSSL SSL_read: Connection问题2unable to access https://github.com//: OpenSSL SSL_read: Connection was reset, errno 10054网速慢问题clone太慢&#xff0c;pull太慢怎么办问题1 Fa…

记录C,C++关键字的位置,直接跳过注释和字符串文本。

依据第二版本&#xff0c;可以写一个跳过注释的查找函数 C_IndexOfWord Java_IndexOfWord CSharp_IndexOfWord 还有一种方法&#xff0c;可以先把所有注释用空格代替&#xff0c;查出的字符位置也不变。 以前版本&#xff1a; DList<TextColor> Syntax::GetTextColor…

m基于matlab的连续相位调制(CPM)解调系统仿真,包括解调,同步等模块

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着数字通信技术的飞速发展&#xff0c;数字通信的调制技术也得到了快速发展&#xff0c;其中连续相位调制(Continuous Phase Modulation&#xff0c;CPM)作为一种全新的通信调制方法得到了越来…

GNN 极简入门

文章目录图基本知识GNN简介GCNPYG极简入门Data Handling of GraphsCommon Benchmark DatasetsMini-batchesData TransformsLearning Methods on Graphs图基本知识 &#x1f638;图是由节点的有穷非空集合和节点之间边的集合组成&#xff0c;通常表示为 G(V,E)G(V, E)G(V,E)&am…

涨知识系列:爆款短视频拍摄技巧之一,构图

拍摄技巧主要分为两个部分&#xff0c;一个是构图&#xff0c;一个是拍摄手法。这部分内容其实也是比较简单的&#xff0c;因为短视频毕竟不需要做到像拍电影那么专业。所以在短视频当中我们只要学会一些基本的技巧就完全够用了。更重要的是我们需要对构图和拍摄手法有一个概念…

基于KT6368A的双模蓝牙模块打印机的方案

目录 一、打印机蓝牙模块简介 目前主流的打印机&#xff0c;很多都还是不带蓝牙。大部分的受限于成本等等原因&#xff0c;都还是通过USB的方式和电脑进行通讯&#xff0c;从而完成打印的数据交互 因为早期蓝牙技术发展的比较缓慢&#xff0c;而打印机类型的产品&#xff0c;…

_12LeetCode代码随想录算法训练营第十二天-C++二叉树

_12LeetCode代码随想录算法训练营第十二天-C二叉树 二叉树基础知识 二叉树的种类 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 完全二叉树 完全二叉树的定义如下…

线段树能解决多少问题?

背景 给一个两个数组&#xff0c;其中一个数组是 A [1,2,3,4]&#xff0c;另外一个数组是 B [5,6,7,8]。让你求两个数组合并后的大数组的&#xff1a; 最大值最小值总和 这题是不是很简单&#xff1f;我们直接可以很轻松地在 O(mn) 的时间解决&#xff0c;其中 m 和 n 分别为…

maven的java工程获取mysql数据库数据【问题及解决过程记录】

创建数据库maven&#xff0c;指定字符集和排序规则 UTF8MB4常用的排序规则&#xff1a;utf8mb4_unicode_ci、utf8mb4_general_ci、utf8mb4_bin&#xff0c;选用哪种方式呢&#xff1f;先来分析一下&#xff1a; 1、准确性&#xff1a; &#xff08;1&#xff09;utf8mb4_unico…

ffmpeg-时间基tbn、tbc、tbr

时间基的作用 源码来自ffmpeg5.1。 时间基在ffmpeg中是通过数据结构有理数AVRational描述的。时间基为时间戳的单位&#xff0c;比如时间基tbn(AVStream.time_base)0.001秒&#xff0c;AVPacket的pts40&#xff0c;则表明该AVPacket要在tbn*pts0.04秒开始显示。 /** 代码路径…

JavaScript 网页特效

一、Offset 1.1 概述 offset > 偏移量 &#xff0c;可以动态的获取的元素的位置、大小等属性。 获得元素距离带有定位父元素的位置获得元素自身的大小(宽度高度) 返回的数值都不带单位 offset常用属性&#xff1a; 属性作用element.offsetParent返回作为该元素带有定位…

全球汽车后行业发展现状:欧洲市场保持稳健 中国产业规模增速较快

根据观研报告网发布的《2022年中国汽车后市场分析报告-市场发展格局与投资潜力研究》显示&#xff0c;汽车后市场&#xff08;AM市场&#xff09;是指汽车在销售之后维修和保养服务及其所包含的汽车零部件、汽车用品和材料的交易市场&#xff0c;它涵盖了消费者买车后所需要的一…

LeetCode 321 周赛

2485. 找出中枢整数 给你一个正整数 n &#xff0c;找出满足下述条件的 中枢整数 x &#xff1a; 1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和。 返回中枢整数 x 。如果不存在中枢整数&#xff0c;则返回 -1 。题目保证对于给定的输入&#xff0c;至多存在一个中…