作者:王姗姗,华清远见嵌入式学院讲师。
从题而看,我们必须要明确的是qmake不仅仅是可以在QT中可以使用,在其他的情况下也可以使用。实际上qmake是一个帮助在不同平台上简化编译步骤的工具,她是来自Trolltech,qmake能够自动生成Makefile 使得只需要少量的信息就可以创建相应的Makefile,qmake能用于很多的软件工程,不管该软件工程是否是用qt写的。
qmake能生成Makefile主要是以工程文件里面的信息为基础.工程文件是开发者创建的,通常是很简单的.但是一些复杂的工程需要创建复杂的工程文件文件,qmake包含别的特性来支持qt开发.自动的包含uic和moc的编译规则.qmake也可以生成Microsoft Visual studio的工程文件而不要求开发者改变qt的工程文件。
Pro文件
首先我们看下面的例子:
1) CONFIG += qt debug
2)HEADERS += hello.h
3)SOURCES += hello.cpp
4)SOURCES += main.cpp
5)win32 {
SOURCES += hellowin.cpp
}
6)unix {
SOURCES += hellounix.cpp
}
7)!exists( main.cpp ) {
error( “No main.cpp file found” )
1) 首先将源文件添加到工程文件,可以使用SOURCES 变量来做这件事情;
2) 接下来添加头文件,用同样的方法添加,不同的是变量名是HEADERS
3) 这是一个qt的程序,我们想把qt加入到CONFIG变量里面 以便qmake能够添加相关需要链接的qt的库和确保moc和uic能包含到将要生成的Makefile里面,所以设置 CONFIG 变量
4) 一个Release版本的程序没有包含任何调试符合或者其他的调试信息,在开发过程中,给程序提供调试版本的的相关信息是十分有用的.所以可以在工程文件里面的CONFIG加上debug就做到了。
5) 当你编码了一段时间后,你的程序可能要做一些平台相关的东西,并且决定保持平台相关的代码独立性.因此你要做成2个新的文件来包含到你的pro文件, hellowin.cpp and hellounix.cpp 我们不能都把这2个文件添加到SOURCES变量中,因为将会在Makefile文件里面包含这2个文件.所以,我们要做的就是使用一个域的东西来使得qmake能处理这样的平台相关的问题.加上第5句,如果是在Windows下运行qmake,就把hellowin.cpp添加到源文件链表里面,如果在别的平台运行qmake,就会忽略它。
6) 加上第六句,创建一个unix平台相关的域
7) 如果某写特定的文件不存在,你可能想不要创建Makefile了,我们可以通过使用exists()函数检查一个文件是否存在,我们使用error()函数可以停止qmake 的处理进程.这些都是域的做法一样.只不过用函数简单的替代域.例子中加上了一个检查main.cpp文件。上面我们分析的是一个pro文件它是用来编译应用程序的,其实它还可以用来编译库以及插件。有时我们还需要修改下pro文件来编译我们的程序,下面给出几个例子:
声明Qt库模块
如果CONFIG变量包含了 qt 这个值,表明qmake支持了qt的程序,但是还需要调整一些你程序中使用的qt 的模块.这是使用QT变量,就能达到这个目的。QT是用来声明使用到的一些额外的模块.例如.通过下面的方法,我们使得XML和网络模块有效
CONFIG += qt
QT += network xml
注意,默认情况下 QT 包含了 core 和 gui模块了所以上面的声明是添加了XML和网络模块到默认的列表里面.下面的语句就是忽略了默认模块,当编译程序源代码时候会导致出错
QT = network xml # This will omit the core and gui modules.
如果你想编译一个不需要gui模块的工程,你需要用”-=”操作符号来去除包含,默认情况下,QT同时包含了core和gui两个模块,所以下面的语句就是小型的Qt工程会被编译
QT -= gui # Only the core module is used.
下面的表格显示了QT变量可以使用的选项,并解释了相应的特点
选项 | 特点 |
core (included by default) | QtCore module 核心模块 |
gui (included by default) | QtGui module 界面模块 |
network | QtNetwork module 支持网络模块 |
opengl | QtOpenGL module 支持opengl图像编程 |
sql | QtSql module 支持sql数据库驱动 |
svg | QtSvg module 支持svg矢量图形 |
xml | QtXml module 支持xml模块 |
qt3support | Qt3Support module 支持qt3类 |
声明Qt库模块
qmake可以通过专门的prf文件设置另外的配置特性.这些特性通常提供给编译时候的自定义的工具使用.为了在处理过程添加一个特性,往CONFIG变量里面添加一个特性名字,该名字跟特性的文件名相同(mkspecs\features目录里面)
例如 qmake可以在编译过程利用pkg-config 提供支持的额外的库,例如D-Bus库 和 ogg库,用下面的方法
CONFIG += link_pkgconfig
PKGCONFIG += ogg dbus-1
声明其他的库
如果你需要在工程中使用其他的库,你需要在工程文件里面指定
让qmake 找到库的路径和相应需要连接的库,可以在LIBS变量里面添加.库的路径要给出,或者常见的unix样式的符号来指定库和库的路径
例如下面的展示了如何使用指定的库
LIBS += -L/usr/local/lib -lmath
可以用类似的方法来指定头文件的路径,不过是使用INCLUDEPATH变量,如下面可能添加好几个头文件的路径
INCLUDEPATH = c:/msdev/include d:/stl/include
不过我的习惯是下面这样的,比较清晰还有,最好windows的路径不要有空格,中文也不要有,斜杠也推荐用/ 而不是windows的\ 因为跟分行符号\相同了 /可以在unix和windows用,但是\貌似到了unix或linux就不行了,所以用/ 是通用的
INCLUDEPATH = c:/msdev/include \
d:/stl/include
运行qmake
当在命令行里面运行qmake时候,可以指定变量选项来定制qmake的行为,这样使得编译过程更协调,提供更有用的诊断信息,并能够使你的工程用于指定的目标平台。
语法
用来运行qmake的语法如下
qmake [mode] [options] files
qmake支持两种不同模式的操作,默认情况下qmake将会使用project中的配置来生成Makefile文件,但是也可以用qmake生成pro文件.如果你想明确的设置选项,你必须在所有其他的选项前指定,模式可以是下面的其中之一的值
·makefile qmake将输出一个Makefile文件。
·project qmake将输出一个pro文件。
下面的选项用来同时指定生成和特殊模式设置。文件参数是列出了一个或者多个工程文件(pro文件) 用空格分开
选项
在命令行里面,为qmake指定一些选项是为了自定义编译的过程。并覆盖平台的为qmake做的默认设置,下面的基本的选项提供了用法信息,指定qmake写到输出文件的那里,控制调试信息的等级在控制台打印出来。
·help 列出qmake帮助信息
·o file 直接输出到文件file。如果这个选项没有指定, qmake将会尝试使用合适的文件名作为输出,这依赖于当前的运行模式。如果指定了‘-’, 输出将会直接在控制台打印出来。
·d 列出qmake的调试信息 由于工程需要在每个目标平台上进行不同的编译,并有很多子目录, 你可以在运行qmake的时候使用下面的选项来设置相应的指定平台的变量:
·unix qmake运行在unix模式。在这个模式下,将会使用unix风格的文件命名规则和路径转换 , 另外的测试unix域是成功的。这是unix平台的默认模式。
·macx qmake运行在Mac OS X模式。在这个模式下,将会使用unix风格的文件命名规则和路径转换 , 另外的测试macx域是成功的。这是Mac OS X平台的默认模式。
·win32 qmake运行在win32模式。在这个模式下,将会使用Windows风格的文件命名规则和路径转换 , 另外的测试win32域是成功的。这是Windows平台的默认模式。 工程的模板通常在pro文件的TEMPLATE 变量里面指定。我们可以使用下面的选项来重写或者覆盖:
·t tmpl qmake将会用tmpl来重写TEMPLATE变量的任何设置, 但只在pro文件被处理之后。
·tp prefix qmake将添加prefix到TEMPLATE变量里面。
调整警告信息的级别能够帮助你找到pro文件的问题所在:
·Wall qmake将会报告所有知道的警告信息。
·Wnone qmake不产生任何警告信息。
·Wparserqmake只产生词法分析的警告。在解析你的pro文件的时候会警告你一些普通的缺陷和潜在问题。
·Wlogic qmake警告你在pro文件存在一些普通
Makefile 模式选项
qmake -makefile [options] files
在 Makefile 模式, qmake将会生成用于编译工程的Makefile文件,另外下面的选项可能在本模式下使用,以影响工程文件的生成方式:
·after qmake将会在指定的文件后面处理一些命令行给出的任务
·nocache qmake将忽略。qmake.cache 文件。
·nodepend qmake将不产生任何依赖信息。
·cache file qmake将使用指定的缓冲文件file而忽略其他找到的.qmake.cache 文件。
·spec spec qmake将会使用spec作为平台的路径和编译器信息, 环境变量 QMAKESPEC 设置的值将会被忽略。
你也可以在命令行传递qmake参数;他们将会在所有的指定的文件之前处理:
qmake -makefile -unix -o Makefile “CONFIG+=test” test.pro
上面的意思就是,在unix模式下,使用test.pro
加入test选项生成Makefile,但是一些指定的选项当他们是默认的情况是没有必要的添加的,因此,如果在unix上 就是下面的
qmake “CONFIG+=test” test.pro
如果你确定你自己想在指定的文件后面处理一些变量,你可以传递-after选项。当这个被指定时,命令行所有的任务在–after选项之后会被延迟,直到指定的文件传进来了。
Project Mode Options
qmake -project [options] files
在工程模式,qmake将会生成pro文件。另外,你可以在本模式下添加下面的选项:
·r qmake将会遍历目录
·nopwd qmake将会不理会你当前工作目录的源代码文件而去使用指定的文件
在这个模式.files变量可以是文件或者目录的列表 如果指定一个目录,将会包含进DEPENDPATH变量里面 目录里面相关的代码会被包含进生成的工程文件里面。 如果给的是文件, 将会添加到正确的变量, 这主要依赖于他们的扩展名(后缀名); 例如, .ui 文件会被添加到 FORMS(qt2是INTERFACES吧), .cpp 文件会被添加到 SOURCES。
在这个模式下。你也可以传递任务到命令行里面, 当这样做的时候,这些任务将会放到生成pro文件之后。
文章评论(0条评论)
登录后参与讨论