QT学习笔记-QT多项目系统中如何指定各项目的编译顺序
Qt_pri 创建使用.pri文件
Qt pro文件、pri文件的写法
---------------------------------------------------
Qt 多项目系统中如何指定各项目的编译顺序 (***笔记)
https://blog.csdn.net/ken2232/article/details/132127866
Qt工程的目录结构 (**)
https://blog.csdn.net/ken2232/article/details/132352593
---------------------------------------------------
参考:
【Qt】如何调整编译顺序? https://blog.csdn.net/sunriver2000/article/details/112008023
---------------------------------------------------
要点:
概念混乱,造成理解困难。
重新定义,如下:
![](https://img-blog.csdnimg.cn/9cbc9c6714224c3da27cada76d1e8954.png)
官方默认:
独立基准项目集合、的管理文件为.pro,这里改为 .prof (f:表示复数)。
独立基准项目、的管理文件为.pro,这里改为 .prod (d:表示单数)。
附注:这里的修改,只是为了方便理解和记忆而已。
.prof 和 .prod,它们的官方默认后缀,都是 .pro。实际上,它们的用途是不同的,语法也有所区别,因此,应该可以将它们划分成不同的文件;这样更容易理解。
对独立基准项目 (.pro) 集合进行集中管理 (.prof)
独立基准项目 (.pro) 集合管理文件 (.prof),例子,如下:
untitled_pro_set.pro ##相当于 .prof文件)的内容
目的:将各个独立基准项目,集中管理
TEMPLATE = subdirs
SUBDIRS += \
untitled \
untitled1
CONFIG += ordered ## 按照从下行到上行的执行顺序,进行编译?
运行顺序:虽然构建是多个项目一起按照某种顺序,进行一遍地构建;但是,如果没有进行额外的设置,则只能执行一个构建后的 app。
如何执行构建后所期望的 app? :
一种办法,如:
SUBDIRS += \
untitled \
untitled1 \
untitled2
1. 清除已构建的文件;
2. 只保留 untitled1进行构建并运行;此时即为 untitled1;
3. 恢复,以后每次都是启动 untitled1 app.
可能原因:执行被记录在 app的记忆文件里,但是,没有菜单选项可以直接进行选择?
QtCreator同时运行多个程序
如下图所示:将Stop applications before building设置为:
None:支持同时打开编译运行多个程序;
Same Project:同一个工程只支持打开一个程序;
ALL:所有工程只支持打开一个程序;
Same Build Directory:同一生成路径只支持打开一个程序,例如:untitled工程debug编译和release编译可以打开两个程序,但是debug只能生成一个或者release只能生成一个,如果在pro文件中使用DESTDIR指定了输出到同一文件夹下,则debug和release只能打开一个程序。
————————————————
原文链接:https://blog.csdn.net/qq_43627907/article/details/128367331
对内嵌附属项目 (.pri) 集合进行集中管理 (.prod)
在独立基准项目的 .pro文件中,至少加入,如下语句:
include(../../BuildConfig.pri)
-----------------------------------------------------------------------------
![](https://img-blog.csdnimg.cn/a9f667e685f24b8b900bd09a50d32821.png)
上图,显示:独立基准项目,可以在后期,再加入到 对独立基准项目 (.pro) 集合进行集中管理 (.prof)。
当然,也可以手工完成。
![](https://img-blog.csdnimg.cn/5982e9ae266045b9bcff178dc6026871.png)
注:
1. 内嵌附属项目的编译,受到基准项目的.pro文件的控制。而基准项目集合之下的项目,是可以独立构建的。
2. 引入第三方的 src文件时,可能最好采用独立项目模型;编译成库文件。
如果采用内嵌附属项目模型,则会受到其上的独立项目.pro文件的影响,造成无法直接成功编译。
3. 在 Qt Creator中,独立基准项目和内嵌附属项目,还是有区别的。
内嵌附属项目是独立基准项目的子集,表现、或理解为“模块”更恰当。
从“Add New”菜单中,它们的菜单既有相同的部分,也有不同的部分,可以看到它们的主要区别。应该属于集合和子集的关系?
4. 内嵌附属项目,在目录和文件结构上,与独立基准项目类似。但在可用的内容模块上,与独立基准项目有很大的不同。
5. 区别 .pro文件 和 .pri文件
5.1. 在内容表现上,类似。但是,在使用它们的方法上,有所不同。
.pro文件直接被 Qt Creator使用;而 .pri文件则是被 .pro文件引用。
5.2. 两种文件的内容,都可以由 Qt Creator建立。
5.2.1. 但是,程序员受限需要手动建立一个空内容的 .pri文件,并手动 include到 .pro文件中;然后,
执行一次 build,使得 内嵌附属项目出现在 Qt Creator中,并受其管理。
以后的 .pri文件的内容,也会受到 Qt Creator的读写管理。
5.2.2. .pro文件直接由 Qt Creator创建,可以不需要程序员关心。
=============================
QT学习笔记-QT多项目系统中如何指定各项目的编译顺序
具体操作
1、首先看一个QT的多项目(子项目)的.pro文件内容,如下:
# 以下模版说明当前项目是有子项目的项目
TEMPLATE = subdirs
# 当前项目包含的子项目
SUBDIRS += \
a3lib \
common \
plc \
test
我实际的引用(依赖)关系是
test 引用 plc(就是说在编译test之前需要先编译plc才行)
plc 引用 common(就是说在编译plc之前需要先编译common才行)
common 引用 a3lib(就是说在编译common之前需要先编译a3lib才行)
默认各子项目(a3lib、common、plc、test)的编译是没有顺序的。
2、要想让QT按上面的顺序进行编译,只需在.pro文件中增加CONFIG += ordered就可以。
CONFIG += ordered
如下:
# 以下模版说明当前项目是有子项目的项目
TEMPLATE = subdirs
# 指定工程的编译顺序
CONFIG += ordered
# 当前项目包含的子项目
SUBDIRS += \
a3lib \
common \
plc \
test
————————————————
版权声明:本文为CSDN博主「CodingPioneer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zlbdmm/article/details/129422288
Qt pro文件、pri文件的写法
1、pro文件概述
.pro文件中,主要包含以下变量:
变量 |
含义 |
CONFIG |
一般项目配置选项 |
DESTDIR |
放置可执行文件或二进制文件的目录 |
FORMS |
由用户界面编译器(uic)处理的ui文件列表 |
HEADERS |
构建项目时使用的头文件(.h)列表 |
QT |
项目中使用到的Qt模块列表,比如sql、network |
RESOURCES |
项目中包含的资源文件(.qrc)列表 |
SOURCES |
构建项目时要使用的源代码(.cpp)文件列表 |
TEMPLATE |
用于该项目的模板,可以选择应用程序,库还是插件 |
2、具体写法
(1)、DESTDIR
指定生成的应用程序放置的目录
DESTDIR += ../bin //当前目录的上一级的bin文件夹
DESTDIR += $$PWD/bin //当前目录的bin文件夹
(2) 、指定生成的moc、ui、obj、rcc文件的存放目录
//这里是在build-xxxxx-Desktop_Qt_5_12_9_MSVC2017_64bit-Release的src文件夹
MOC_DIR += ../moc
RCC_DIR +=../ res
UI_DIR += ../ui
OBJECTS_DIR += ../obj
(3) 、头文件包含的路径
INCLUDEPATH += $$PWD/include//当前目录的include文件夹下
(4) 、程序编译时依赖的相关路径
//当前目录的include文件夹
DEPENDPATH += $$PWD/include
(5) 、lib包引入的路径,区分linux系统和windows系统
#temporary file dir临时文件存放目录
CONFIG(debug, debug|release){
DESTDIR = $${PWD}/bin/Qt_$${QT_VERSION}_Debug
LIBS+= -L$${PWD}/bin/Qt_$${QT_VERSION}_Debug
}
else{
DESTDIR = $${PWD}/bin/Qt_$${QT_VERSION}_Release
LIBS+= -L$${PWD}/bin/Qt_$${QT_VERSION}_Release
}
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/xxxx/ -lxxxx
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/xxxx/ -lxxxxd
else:unix: LIBS += -L$$PWD/lib/xxxx/ -lxxxxc
3、pri文件
可以把.pro文件中的一部分内容单独放到.pri文件中,这样,在写大型项目时,就可以直接通过include引用。
(1)需要手动新建BuildConfig.pri文件,创建一个文本文件,然后修改后缀即可
(2)在.pro文件中加入
根据自己的目录来写
include(../../BuildConfig.pri)
include($$PWD/BuildConfig.pri)
(3) 通过上面的方式进行引用即可,一般在.pri文件中写DESTDIR和CONFIG
Qt Pri详解
更新:2023-05-21 07:58
https://www.python100.com/html/109872.html
一、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/bin
INCLUDEPATH += $$PWD/include
LIBS += -ldl
target.path = $$TARGET_DIR
target.name = myapp
message(Building ... $$TARGET)
message(Source files: $$SOURCES)
contains(CONFIG, debug) {
message(Building in debug mode...)
TARGET = myappd
COMMON_FLAGS = -g -O0
}
contains(CONFIG, release) {
message(Building in release mode...)
TARGET = myapp
COMMON_FLAGS = -O2
}
sources = $$files($$SRC_DIR/*.cpp)
target.sources = $$sources
OBJECTS_DIR = $$OBJ_DIR/$$TARGET
mocable_headers = $$_PRO_FILE_PWD_/input.h
mocables = $$mocable_headers
mocables.headers = $$mocable_headers
mocables.commands = $$QTDIR/bin/moc $$mocables.headers -o $$mocables.target
QMAKE_EXTRA_TARGETS += mocables
unix {
target.commands = $$QMAKE_CXX -o $$TARGET $$OBJECTS $$LIBS
mocables.target = $${OBJECTS_DIR}/input.moc
mkdir($${OBJECTS_DIR})
} else {
target.commands = link -out:$$TARGET.exe $$OBJECTS $$LIBS
mocables.target = $${OBJECTS_DIR}/input.moc.obj
mkdir($$system_path($${OBJECTS_DIR}))
}
target.dependency_type = TYPE_C
target.CONFIG += dll
target.LIBS += -lfoo
DISTFILES += $$PWD/post_install_script
mocables.CONFIG += no_link_target
INSTALLS += 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文件可以根据需求定制,支持多库编译、多平台编译、资源文件编译等等,大大提高了开发效率。