Qt工程.pro文件变量解析

Qt工程的管理文件为*.pro,Qt Creator会先解析这个文件,如果解析有错误,会显示空工程。

编译Qt工程时,qmake会先将*.pro文件解析生成Makefile,然后调用编译器进行编译。

本文介绍*.pro文件中会用到的一些变量。

qmake命令

1
qmake ‐project

会把本目录及其子目录内所有.cpp .h 文件加入到项目输入文件 pro 文件中,使用是注意移去其他无用的文件。

#xxx

注释, 从“#”开始,到这一行结束

SOURCES

源文件

模式1

1
SOURCES = *.cpp

模式2

1
SOURCES = 1.cpp 2.cpp 3.cpp

模式3

1
2
SOURCES = 1.cpp \
2.cpp

模式4

1
2
SOURCES += 1.cpp
SOURCES += 2.cpp

HEADERS

头文件

模式1

1
HEADERS = hello.h

模式2

1
HEADERS += hello.h

TEMPLATE

当前工程所使用的模板

1
TEMPLATE = app
  • app(建立一个应用程序的 makefile。这是默认值,所以如果模板没有被指定,这个将被使用。)
  • subdirs(这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile 并且为它调用 make 的 makefile)
  • lib(建立一个库的 makefile)
  • vcapp ‐ 建立一个应用程序的 Visual Studio 项目文件。
  • vclib ‐ 建立一个库的 Visual Studio 项目文件。

CONFIG

模式

1
CONFIG += qt warn_on release

配置信息

  • release 应用程序将以 release 模式连编。如果“debug”被指定,它将被忽略。
  • debug 应用程序将以 debug 模式连编。
  • warn_on 编译器会输出尽可能多的警告信息。如果“warn_off” 被指定,它将被忽略。
  • warn_off 编译器会输出尽可能少的警告信息。

连编的库/应用程序的类型

  • qt 应用程序是一个 Qt 应用程序,并且 Qt 库将会被连接。
  • thread 应用程序是一个多线程应用程序。
  • x11 应用程序是一个 X11 应用程序或库。
  • windows 只用于“app”模板:应用程序是一个 Windows 下的窗口应用程序。
  • console 只用于“app”模板:应用程序是一个 Windows 下的控制台应用程序。
  • dll 只用于“lib”模板:库是一个共享库(dll)。
  • staticlib 只用于“lib”模板:库是一个静态库。
  • plugin 只用于“lib”模板:库是一个插件,这将会使 dll 选项生效。

TARGET

模式

1
TARGET = filename

指定目标文件名 - 如果不设置该项目,目标名会被自动设置为跟项目文件一样的名称

INCLUDEPATH

用例

1
INCLUDEPATH += .

头文件包含路径

DEPENDPATH

程序编译时依赖的相关路径

用例

1
DEPENDPATH += . forms include qrc sources

VPATH

寻找补充文件的搜索路径。

QT

加入库模块

用例

1
QT += xml

LIBS

设置本工程需要的库位置和库文件

用例

1
2
3
4
5
6
LIBS += -L folderPath #引入的 lib 文件的路径
LIBS += -lLibName #引入 lib 文件

LIBS += -L"$(SolutionDir)lib" \
-lopengl32 \
-lglu32

INTERFACES / FORMS

工程中包含的.ui 设计文件

用例

1
INTERFACES = filename.ui 
1
FORMS += forms/painter.ui

DESTDIR

指定生成的应用程序放置的目录

用例

1
DESTDIR += ../bin

UI_DIR / RCC_DIR / MOC_DIR / OBJECTS_DIR

  • 指定 uic 命令将.ui 文件转化成 ui_*.h 文件的存放的目录
  • 指定 rcc 命令将.qrc 文件转换成 qrc_*.h 文件的存放目录
  • 指定 moc 命令将含 Q_OBJECT 的头文件转换成标准 *.h 文件的存放目录
  • 指定目标文件的存放目录

用例

1
2
3
4
UI_DIR += forms
RCC_DIR += ../tmp
MOC_DIR += ../tmp
OBJECTS_DIR += ../tmp

DEF_FILE / RC_FILE / RES_FILE

只有 Windows 需要

  • 应用程序所要连接的.def 文件。
  • 应用程序的资源文件。
  • 应用程序所要连接的资源文件。

LEXSOURCES / YACCSOURCES

  • 应用程序中的所有 lex 源文件的列表。
  • 应用程序中的所有 yacc 源文件的列表。

RESOURCES

工程中包含的资源文件

用例

1
RESOURCES += qrc/painter.qrc

CODECFORSRC

源文件编码方式

1
CODECFORSRC = GBK

LANGUAGE

1
LANGUAGE = C++

操作符

平台相关性处理

用例

1
2
3
4
5
6
7
win32 {
SOURCES += hello_win.cpp
}

unix{
SOURCES += hello_linux.cpp
}

局部变量

1
2
3
4
5
6
7
win32:thread {
DEFINES += QT_THREAD_SUPPORT
} else:debug {
DEFINES += QT_NOTHREAD_DEBUG
} else {
warning("Unknown configuration")
}

变量到目前为止我们遇到的变量都是系统变量,比如 DEFINES、SOURCES 和 HEADERS。

你也可以为你自己创建自己的变量,这样你就可以在作用域中使用它们了。创建自己的变量很容易,只要命名它并且分配一些东西给它。比如:

1
MY_VARIABLE = value 

你也可以通过在其它任何一个变量的变量名前加$$来把这个变量的值分配给当前的变量。例如:

1
MY_DEFINES = $$DEFINESMY_DEFINES = $${DEFINES}

第二种方法允许你把一个变量和其它变量连接起来,而不用使用空格。qmake 将允许一个变量包含任何东西(包括$(VALUE),可以直接在 makefile 中直接放置,并且允许它适当地扩张,通常是一个环境变量)。无论如何,如果你需要立即设置一个环境变量,然后你就可以使用$$()方法。比如:

1
MY_DEFINES = $$(ENV_DEFINES)

这将会设置 MY_DEFINES 为环境变量 ENV_DEFINES 传递给*.pro 文件的值。

= / += / *= / ~= 操作符

  • 分配一个值给一个变量
  • 向一个变量的值的列表中添加一个值
  • 从一个变量的值的列表中移去一个值,表示不支持
  • 仅仅在一个值不存在于一个变量的值的列表中的时候,把它添加进去
  • 替换任何与指定的值的正则表达式匹配的任何值

用例

1
DEFINES ~= s/QT_[DT].+/QT #将QT_D/QT_T/QT_等等开头的字符替换为QT

内置函数

  • join( variablename, glue, before, after) 这将会在 variablename 的各个值中间加入 glue。如果这个变量的值为非空,那么就会在值的前面加一个前缀 before 和一个后缀 after。只有 variablename 是必须的字段,其它默认情况下为空串。如果你需要在 glue、before 或者 after 中使用空格的话,你必须提供它们。
  • member( variablename, position ) 这将会放置 variablename 的列表中的 position 位置的值。如果 variablename 不够长,这将会返回一个空串。variablename 是唯一必须的字段,如果没有指定位置,则默认为列表中的第一个值。
  • find( variablename, substr ) 这将会放置 variablename 中所有匹配 substr 的值。substr 也可以是正则表达式,而因此将被匹配。
1
2
3
MY_VAR = one two three four	
MY_VAR2 = $$join(MY_VAR, " ‐L", ‐L) ‐Lfive #MY_VAR2 将会包含“‐Lone ‐Ltwo ‐Lthree ‐Lfour ‐Lfive”,
MY_VAR3 = $$member(MY_VAR, 2) $$find(MY_VAR, t.*) #MYVAR3 将会包含“three two three”。
  • system( program_and_args ) 这将会返回程序执行在标准输出/标准错误输出的内容,并且正像平时所期待地分析它。比如你可以使用这个来询问有关平台的信息。
1
2
3
UNAME = $$system(uname ‐s)	
contains( UNAME, [lL]inux ):
message( This looks like Linux ($$UNAME) to me )

测试函数

  • contains( variablename, value ) 如果 value 存在于一个被叫做 variablename 的变量的值的列表中,那么这个作用域中的设置将会被处理。例如:
1
2
3
contains(CONFIG, thread) {	
DEFINES += QT_THREAD_SUPPORT
} #如果 thread 存在于 CONFIG 变量的值的列表中时,那么 QT_THREAD_SUPPORT 将会被加入到 DEFINES 变量的值的列表中。
  • count( variablename, number ) 如果 number 与一个被叫做 variablename 的变量的值的数量一致,那么这个作用域中的设置将会被处理。例如:
1
2
3
count( DEFINES, 5 ) {
CONFIG += debug
}
  • error( string ) 这个函数输出所给定的字符串,然后会使 qmake 退出。例如:
1
error( "An error has occured" )#文本“An error has occured”将会被显示在控制台上并且qmake 将会退出。
  • exists( filename ) 如果指定文件存在,那么这个作用域中的设置将会被处理。例如:
1
2
3
exists(/local/qt/qmake/main.cpp)   {
SOURCES += main.cpp
} #如果 /local/qt/qmake/main.cpp 存在,那么 main.cpp 将会被添加到源文件列表中。注意可以不用考虑平台使用“/”作为目录的分隔符。
  • !exists(filename) 如果一个文件不存在,停止 qmake。用例:
1
2
3
!exists( main.cpp ) { 
error( "No main.cpp file found")
}
  • include( filename ) 项目文件在这一点时包含这个文件名的内容,所以指定文件中的任何设置都将会被处理。例如:
1
include( myotherapp.pro )#myotherapp.pro 项目文件中的任何设置现在都会被处理。
  • isEmpty( variablename ) 这和使用 count( variablename, 0 )是一样的。如果叫做 variablename 的变量没有任何元素,那么这个作用域中的设置将会被处理。例如:
1
2
3
isEmpty( CONFIG ) {	
CONFIG += qt warn_on debug
}
  • message( string ) 这个函数只是简单地在控制台上输出消息。
1
message( "This is a message" )#文本“This is a message”被输出到控制台上并且对于项目文件的处理将会继续进行。
  • system( command ) 特定指令被执行并且如果它返回一个 1 的退出值,那么这个作用域中的设置将会被处理。例如:
1
2
3
4
system( ls /bin ) {	
SOURCES += bin/main.cpp
HEADERS += bin/main.h
} #所以如果命令 ls /bin 返回 1,那么 bin/main.cpp 将被添加到源文件列表中并且 bin/main.h 将被添加到头文件列表中。
  • infile( filename, var, val ) 如果 filename 文件(当它被 qmake 自己解析时)包含一个值为 val 的变量 var,那么这个函数将会返回成功。你也可以不传递第三个参数(val),这时函数将只测试文件中是否分配有这样一个变量 var。

项目

目标:为一个库文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
TEMPLATE = lib	# 编译项目文件所需头文件的路径
INCLUDEPATH += ../common # 目标文件路径
DESTDIR=../lib # 条件依赖:Unix 平台上 定义本想目的 UI 目录, MOC 目录, 目的目录
unix {
UI_DIR = ../.ui
MOC_DIR = ../.moc
OBJECTS_DIR = ../.obj
}
#本项目配置:
CONFIG += qt warn_on release thread
#Input 头文件,源文件
HEADERS += COMControllerThread.h \
DecodeSMS.h \
monitor_common.h \
monitor_interface.h \
MonitorThread.h \
UserEvent.h \
MyCOM.h \
MySMS.h \
MyTagHandle.h \
SMSParseThread.h \
tag_dict.h
SOURCES += COMControllerThread.cpp \
DecodeSMS.cpp \
monitor_common.cpp \
monitor_interface.cpp \
MonitorThread.cpp \
MyCOM.cpp \
MySMS.cpp \
MyTagHandle.cpp \
SMSParseThread.cpp \
tag_dict.cpp

Qt工程.pro文件变量解析
https://blog.jackeylea.com/qt/parse-qt-pro-file-var/
作者
JackeyLea
发布于
2022年3月3日
许可协议