文档章节

qmake用户手册——qmake高级概念

TemetNosce
 TemetNosce
发布于 2016/09/19 17:08
字数 2354
阅读 14
收藏 0

qmake高级概念

迄今为止,我们见到的qmake项目文件都非常简单,仅仅是一些name = value和name += value的列表行。qmake提供了很多更强大的功能,比如你可以使用一个简单的项目文件来为多个平台生成makefile。 操作符

到目前为止,你已经看到在项目文件中使用的=操作符和+=操作符。这里能够提供更多的可供使用的操作符,但是其中的一些需要谨慎地使用,因为它们也许会比你期待的改变的更多。 “=”操作符

这个操作符简单分配一个值给一个变量。使用方法如下:

TARGET = myapp

这将会设置TARGET变量为myapp。这将会删除原来对TARGET的任何设置。 “+=”操作符

这个操作符将会向一个变量的值的列表中添加一个值。使用方法如下:

DEFINES += QT_DLL

这将会把QT_DLL添加到被放到makefile中的预处理定义的列表中。 “-=”操作符

这个操作符将会从一个变量的值的列表中移去一个值。使用方法如下:

DEFINES -= QT_DLL

这将会从被放到makefile中的预处理定义的列表中移去QT_DLL。 “*=”操作符

这个操作符仅仅在一个值不存在于一个变量的值的列表中的时候,把它添加进去。使用方法如下:

DEFINES *= QT_DLL

只用在QT_DLL没有被定义在预处理定义的列表中时,它才会被添加进去。 “~=”操作符

这个操作符将会替换任何与指定的值的正则表达式匹配的任何值。使用方法如下:

DEFINES ~= s/QT_[DT].+/QT

这将会用QT来替代任何以QT_D或QT_T开头的变量中的QT_D或QT_T。 作用域

作用域和“if”语句很相似,如果某个条件为真,作用域中的设置就会被处理。作用域使用方法如下:

win32 {
    DEFINES += QT_DLL
}

上面的代码的作用是,如果在Windows平台上使用qmake,QT_DLL定义就会被添加到makefile中。如果在Windows平台以外的平台上使用qmake,这个定义就会被忽略。你也可以使用qmake执行一个单行的条件/任务,就像这样:

win32:DEFINES += QT_DLL

比如,假设我们想在除了Windows平台意外的所有平台处理些什么。我们想这样使用作用域来达到这种否定效果:

!win32 {
    DEFINES += QT_DLL
}

CONFIG行中的任何条目也都是一个作用域。比如,你这样写:

CONFIG += warn_on

你将会得到一个称作“warn_on”的作用域。这样将会使在不丢失特定条件下可能所需的所有自定义设置的条件下,很容易地修改项目中的配置。因为你可能把你自己的值放到CONFIG行中,这将会为你的makefile而提供给你一个非常强大的配置工具。比如:

CONFIG += qt warn_on debug
debug {
    TARGET = myappdebug
}
release {
    TARGET = myapp
}

在上面的代码中,两个作用域被创建,它们依赖于CONFIG行中设置的是什么。在这个例子中,debug在CONFIG行中,所以TARGET变量被设置为myappdebug。如果release在CONFIG行中,那么TARGET变量将会被设置为myapp。

当然也可以在处理一些设置之前检查两个事物。例如,如果你想检查平台是否是Windows并且线程设置是否被设定,你可以这样写:

win32 {
    thread {
        DEFINES += QT_THREAD_SUPPORT
    }
}

为了避免写出许多嵌套作用域,你可以这样使用冒号来嵌套作用域:

win32:thread {
    DEFINES += QT_THREAD_SUPPORT
}

一旦一个测试被执行,你也许也要做else/elseif操作。这种情况下,你可以很容易地写出复杂的测试。这需要使用特殊的“else”作用域,它可以和其它作用域进行组合(也可以向上面一样使用冒号),比如:

win32:thread {
    DEFINES += QT_THREAD_SUPPORT
} else:debug {
    DEFINES += QT_NOTHREAD_DEBUG
} else {
    warning("Unknown configuration")
}

变量

到目前为止我们遇到的变量都是系统变量,比如DEFINES、SOURCES和HEADERS。你也可以为你自己创建自己的变量,这样你就可以在作用域中使用它们了。创建自己的变量很容易,只要命名它并且分配一些东西给它。比如:

MY_VARIABLE = value

现在你对你自己的变量做什么是没有限制的,同样地,qmake将会忽略它们,除非需要在一个作用域中考虑它们。

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

MY_DEFINES = $$DEFINES

现在MY_DEFINES变量包含了项目文件在这点时DEFINES变量的值。这也和下面的语句一样:

MY_DEFINES = $${DEFINES}

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

MY_DEFINES = $$(ENV_DEFINES)

这将会设置MY_DEFINES为环境变量ENV_DEFINES传递给.pro文件地值。另外你可以在替换的变量里调用内置函数。这些函数(不会和下一节中列举的测试函数混淆)列出如下: 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也可以是正则表达式,而因此将被匹配。

MY_VAR = one two three four
MY_VAR2 = $$join(MY_VAR, " -L", -L) -Lfive
MY_VAR3 = $$member(MY_VAR, 2) $$find(MY_VAR, t.*)

MY_VAR2将会包含“-Lone -Ltwo -Lthree -Lfour -Lfive”,并且MYVAR3将会包含“three two three”。 system( program_and_args )

这将会返回程序执行在标准输出/标准错误输出的内容,并且正像平时所期待地分析它。比如你可以使用这个来询问有关平台的信息。

UNAME = $$system(uname -s)
contains( UNAME, [lL]inux ):message( This looks like Linux ($$UNAME) to me )

测试函数

qmake提供了可以简单执行,但强大测试的内置函数。这些测试也可以用在作用域中(就像上面一样),在一些情况下,忽略它的测试值,它自己使用测试函数是很有用的。 contains( variablename, value )

如果value存在于一个被叫做variablename的变量的值的列表中,那么这个作用域中的设置将会被处理。例如:

contains( CONFIG, thread ) {
    DEFINES += QT_THREAD_SUPPORT
}

如果thread存在于CONFIG变量的值的列表中时,那么QT_THREAD_SUPPORT将会被加入到DEFINES变量的值的列表中。 count( variablename, number )

如果number与一个被叫做variablename的变量的值的数量一致,那么这个作用域中的设置将会被处理。例如:

count( DEFINES, 5 ) {
    CONFIG += debug
}

error( string )

这个函数输出所给定的字符串,然后会使qmake退出。例如:

error( "An error has occured" )

文本“An error has occured”将会被显示在控制台上并且qmake将会退出。 exists( filename )

如果指定文件存在,那么这个作用域中的设置将会被处理。例如:

exists( /local/qt/qmake/main.cpp ) {
    SOURCES += main.cpp
}

如果/local/qt/qmake/main.cpp存在,那么main.cpp将会被添加到源文件列表中。

注意可以不用考虑平台使用“/”作为目录的分隔符。 include( filename )

项目文件在这一点时包含这个文件名的内容,所以指定文件中的任何设置都将会被处理。例如:

include( myotherapp.pro )

myotherapp.pro项目文件中的任何设置现在都会被处理。 isEmpty( variablename )

这和使用count( variablename, 0 )是一样的。如果叫做variablename的变量没有任何元素,那么这个作用域中的设置将会被处理。例如:

isEmpty( CONFIG ) {
    CONFIG += qt warn_on debug
}

message( string )

这个函数只是简单地在控制台上输出消息。

message( "This is a message" )

文本“This is a message”被输出到控制台上并且对于项目文件的处理将会继续进行。 system( command )

特定指令被执行并且如果它返回一个1的退出值,那么这个作用域中的设置将会被处理。例如:

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。

本文转载自:http://www.kuqin.com/qtdocument/qmake-manual-6.html

TemetNosce
粉丝 1
博文 48
码字总数 24514
作品 0
成都
程序员
私信 提问
针对QT——“在程序文件中(*ui,*cpp,*h)更改之后编译运行的程序结果无法更新”——解决方案

本篇文章主要介绍在QT中,对程序文件(ui,cpp,*h)更改之后编译运行的程序结果却无法更新的解决方案。 问题描述 在设计QT的GUI用户界面时,我们需要不断对程序文件进行修改以优化用户体验,因...

qq_1196581964
2018/12/25
0
0
解决qt-creator提示没有有效的Qt版本问题

qt-creator是一个很好的c/c++开发工具,使用该工具查看源码十分方便。但是又是出现问题也让人头疼万分…… 在qt-creator中创建新项目时,提示如下错误: 出现该问题的原因是没有找到相应的q...

鉴客
2012/07/11
4.3K
0
用qmake生成Makefile

1.简介:   qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。是qt工具包的一部分.在Unix&linux上写程式的人大概都碰过Makefile。用 make来开发和编译程式的确很方便...

openthings
2015/01/22
0
0
让qmake像cmake一样自动查找python

本文是介绍qmake的,不过要以cmake编译嵌入python的C++程序开篇。 例子 简简单单,一个在C、C++中嵌入python的例子 这个例子嵌入一个python解释器,执行一条python的print语句。程序运行结果...

晨曦之光
2012/05/08
693
0
QT中PRO文件写法的详细介绍

在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下: 1. 注释 从“#”开始,到这一行结束。 2.模板变量告诉qmake为这个应用程序生成哪种mak...

石头哥哥
2016/02/16
688
0

没有更多内容

加载失败,请刷新页面

加载更多

ngrok 外网映射工具

ngrok介绍 许多刚学java web的同学(包括我自己)肯定都非常好奇,如何在外网上访问自己做的项目,跟我们本地访问tomcat有什么区别? 今天就向大家介绍一个非常强大的外网映射工具:ngrok.ngrok可以...

edison_kwok
54分钟前
2
0
Spark Streaming的优化之路——从Receiver到Direct模式

          作者:个推数据研发工程师 学长 1 业务背景 随着大数据的快速发展,业务场景越来越复杂,离线式的批处理框架MapReduce已经不能满足业务,大量的场景需要实时的数据处理结果来...

个推
今天
4
0
壮丽70年·奋斗新时代|蒸妙集团熏蒸中会阴熏蒸的神奇好处

聚结相合之处为会。会阴居两阴间,为督、任、冲三脉的起点,三脉背出两阴之间,会聚阴部,因名会阴。会阴,经穴名。出《针灸甲乙经》。会阴别名屏翳、下极、金门。属任脉。在会阴部,男性当阴...

公益传承
今天
2
0
pentaho-kettle-8.2.0.0-R源码开发环境搭建

1.从Kettle官网下载源码,本文使用的是pentaho-kettle-8.2.0.0-R 下载地址:https://codeload.github.com/pentaho/pentaho-kettle/zip/8.2.0.0-R 2.打开eclipse,选择一个新的工作空间,然后设...

gq_2010
今天
1
0
lua web快速开发指南(7) - 高效的接口调用 - httpc库

httpc库基于cf框架都内部实现的socket编写的http client库. httpc库内置SSL支持, 在不使用代理的情况下就可以请求第三方接口. httpc支持header、args、body、timeout请求设置, 完美支持各种h...

水果糖的小铺子
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部