Qmake在QT中的使用

来源:互联网 发布:怎么使用mysql 编辑:程序博客网 时间:2024/06/13 06:40

作者:王姗姗华清远见嵌入式学院讲师。

 从题而看,我们必须要明确的是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类

要注意的是,添加opengl到QT变量里面 ,等价于往CONFIG变量里面添加,所以对qt应用程序,没有必要同时往QT变量和CONFIG变量里面添加opengl选项

声明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文件之后。