1、qmake介绍
qmake是一个构建工具(build tool),用于自动生成makefile文件。像其他构建工具一样,qmake也支持跨平台构建。qmake编辑的是一个后缀名为.pro的文件。按照qmake的语法规则可以编写工程文件对工程信息进行描述。qmake语法相对简单,可以用于描述简单工程,也可以用于描述相对比较复杂的工程。针对qt工程,qmake会自动包含moc编译器和uic编译器的调用规则。不仅仅针对qt工程,其他工程也可以用qmake进行描述。此外,qmake还可以生成vs工程文件。
2、qmake工程文件元素
(1)变量
每个变量用于存储一个字符串列表。qmake有一些预定的变量例如CONFIG、SOURCES、HEADERS等变量。此外,用户还可以自定义变量,用于存储临时字符串列表。
经常使用的变量列表如下:
(2)批注
可以在.pro文件中增加批注。批注起始于‘#’符号延续至本行结束位置。例如:
(3)内置函数
qmake提供了一些内置函数,比较常用的内置函数之一为include()函数,它可以将另外一个工程文件引入当前文件。例如:include(other.pro)函数会把other.pro文件的内容展开到函数所在位置。
(4)控制流
qmake通过作用域方式支持条件结构。类似于if语句。当条件成立时,{}内的内容会被执行。
例如:
当CONFIG变量中包含win32字符串时,SOURCES变量赋值语句会被执行。
3、qmake语法
(1)操作符
1)赋值运算符(=):将一个字符串赋给一个变量。此运算符会覆盖变量已有内容
2)附加运算符(+=): 将一个字符串附加到变量字符串列表中。
3)移出运算符(-=):从变量字符串列表中移除指定字符串。
4)附加唯一值运算符(*=):当变量字符串列表中没有指定的字符串时,将此字符串添加至字符串列表中。此运算符可以避免向变量字符串列表中重复添加某个字符串。
5)替换运算符(~=):将字符串列表中,满足某个正则表达式的字符串换为特定值
(2)变量扩展
1)可以通过$$运算符提取变量中的内容。所提取的内容可以付给其他变量或者作为参数传给函数。
2)可以用$$()或$()运算符获取环境变量中的内容。$$(PWD)当工程文件被处理的时候进行求值。$(PWD)运算符当makefile被处理时进行求值。
(3)作用域
1)作用域用于表示条件结构。它由一个条件及一个包含在大括号内的语句组成。当条件成立时,括号内的语句会被执行。
2)可以在条件前增加!符号,表示当条件语句不成立时执行括号内语句。
3)作用域可以嵌套。或者用:符号表示。下列两种表达方式是等价的
4)|运算符用类似于逻辑或。当两个条件一个成立时,括号内的语句会被执行
5)else作用域类似于C++语言中的if else结构。当前面的作用域条件为假时,else作用域会被执行。
6)可以用:运算符实现单行条件赋值
7)CONFIG变量字符串列表中的值可以作为作用域的条件。
(4)变量
1)当遇到一个变量被赋值时,qmake会自动创建一个变量。
2)$$运算符可以提取变量内容
3)$${}运算符可以将一个变量的值和其他字符串进行组合时中间没有空格。
(5)替换函数(replace function)
1)qmake提供了一些内置函数,这些函数可以接受变量值作为参数并返回一个字符串或者一个字符串列表
2)用户也可以自定义自己的替换函数
(6)测试函数(test function)
1)qmake提供了一组内置的函数,这些函数可以作为作用域的条件进行使用。这些函数不返回值,仅仅指示成功或者失败。
2)用户可以定义自己的测试函数
(7)对象
在有些场合需要定义对象。当用户描述一个对象的成员变量时,qmake自动定义一个对象。
4、安装文件
(1)qmake支持安装操作:当工程被编译完成后,将指定文件考入指定目录(或执行一些批处理命令)。
(2)INSTALLS变量中记录了安装集。添加安装集方式如下:
1)定义一个对象,并将目标地址赋值给他的path成员变量,
2)将要拷贝的文件列表赋值给files成员变量(可以通过正则表达式指定)
3)将额外操作赋值给extra成员变量
4)将对象名称附加到INSTALLS变量
5、添加自定义目标
(1)用户可以指定qmake生成的makefile文件中包含自定义目标。
( 2)添加自定义目标的方式:
1)定义一个对象,并将目标名称赋值给target成员变量
2)将目标所需执行的命令列表赋值给commond成员变量
3)将目标的依赖列表赋值给depends成员变量
4)将对象名称附加到QMAKE_EXTRA_TARGETS变量中
6、预编译头文件
qmake使用预编译头文件的方式很简单,只要将预编译头文件的名称赋值给PRECOMPILED_HEADER变量即可。(在HEADERS变量中不要添加预编译头文件名称)
7、属性
(1)不同于变量,属性的值可以永久保存。
(2)可以通过$$[]运算符提取属性的内容
3)可以通过qmake -query 获取属性值,或者属性列表
4)可以用过qmake -set PROPERTY VALUE命令设置属性的值。
8、QMAKESPEC变量
开始的时候不太理解问什么qmake会自动生成对应与vs2019的makefile文件,后来看到这个变量的说明我好像理解了。qmake安装路径下有很多预定义的平台和编译器描述文件。而 QMAKESPEC变量指定了某个描述文件。因此qmake会根据这个描述文件生成对应的makefile文件。
9、声明QT库
(1)qmake可以指定当前工程使用哪些qt库模块。
(2)当CONFIG变量包含qt值时,qmake对qt应用程序的支持被打开
(3)通过对Qt变量附加所需要的Qt库名称,来指定工程所使用的Qt库模块
(4) Qt变量默认包含core及gui模块。
10、声明附加库
通过向LIBS变量追加库文件路径名称来指定工程所使用的附加库。
11、指定附加包含路径
通过向INCLUDEPATH变量追加头文件所在的文件夹路径来指定附加包含路径
12、工程模板类型
(1)qmake支持以下工程类型:
(2)通过向TEMPLATE变量赋值来指定当前工程类型。
13、创建应用程序类型工程
(1)将app赋值给TEMPLATE变量,指定当前工程类型为应用程序
(2)应用程序类型如下:
(3)可以向CONFIG变量追加以上值来指定应用程序类型。
14、常见库类型工程
(1)将lib值赋值给TEMPLATE变量,指定当前工程类型为库
(2)库类型如下:
(3)可以向CONFIG变量追加以上值来指定库类型。
(4)可以通过向VERSION变量赋值,来指定库版本编号
15、运行qmake
(1)qmake命令格式如下:
(2)mode参数指定qmake生成的结果文件类型
1)-makefile值指定qmake生成makefile文件
2)-project值指定qmake根据指定目录中的头文件及源文件生成.pro文件
(3)在工程文件所在路径直接输入qmake会默认生成makelist文件。
16、生成vs工程文件
可以通过如下命令生成vs工程文件“