Chinaunix首页 | 论坛 | 博客
  • 博客访问: 617493
  • 博文数量: 178
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 2162
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-12 20:06
文章分类

全部博文(178)

文章存档

2011年(1)

2010年(94)

2009年(86)

我的朋友

分类:

2009-12-02 14:55:21

qmake手册(初级部分)

qmake是一个帮助在不同平台上简化编译步骤的工具,她是来自Trolltech,qmake能够自动生成Makefile 使得只需要少量的信息就可以创建相应的Makefile,qmake能用于很多的软件工程,不管该软件工程是否是用qt写的.

qmake能生成Makefile主要是以工程文件里面的信息为基础.工程文件是开发者创建的,通常是很简单的.但是一些复杂的工程需要创建复杂的工程文件文件,qmake包含别的特性来支持qt开发.自动的包含uicmoc的编译规则.qmake也可以生成Microsoft Visual studio的工程文件而不要求开发者改变qt的工程文件

Getting Started 开始吧

qmake指南 和 qmake 常用工程 提供了浏览,以便帮助新手开始qmake的使用

下面的就是连接了

  • qmake指南
    • 从简单易懂开始
    • 使得程序可调试
    • 添加特殊平台的源文件
    • 停止qmake如果文件不存在
    • 检查更多条件
    • 编译成可执行程序
      • app模板
    • 编译成库
      • 库模板
    • 编译成插件
      • 编译成qt designer的插件
    • 调试模式和发布模式的编译和安装
      • 两种模式同时编译
      • 两种模式同时安装

qmake指南

本指南教导你怎么使用qmake,我们建议你看完了本指南后去阅读一下qmake用户手册

从简单易懂的开始

我们假设你完成了一个你的程序基本文件建立.比如下面的文件

  • hello.cpp
  • hello.h
  • main.cpp

你可以在你的qt的安装目录的examples/qmake/tutorial里面找到这些文件.首先使用一个你喜欢的编辑器创建一个叫hello.pro的文件,第一件你要做的事情是添加一行字 来告诉qmake 关于头文件和源文件是你的工程的组成部分

我们将先添加源文件到工程文件,你需要使用 变量来做这件事情.新起一行写上 SOURCES += 后面跟着hello.cpp 例如

SOURCES += hello.cpp

我们重复做同样的事情 来添加源文件到工程文件里面,最后就成了下面的样子

SOURCES += hello.cpp

SOURCES += main.cpp

如果你喜欢使用Makefile的语法风格,可以写成下面的形式

SOURCES = hello.cpp \

main.cpp

现在源文件已经列在了工程文件里面了,接下来添加头文件,他们也是用同样的方法添加,不同的是变量名是

做了这步的话,我们的工程文件应该是下面的样子了

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

一般情况下编译出来的目标的名字自动设置成跟工程文件名一样的名字,但是根据不同的系统加上了适当的后缀名,比如,你的工程文件名叫hello.pro那么目标在windows就是hello.exe而在Unix就是hello,如果你想使用一个不同的名字,你可以在工程文件名里面加入以下设置

TARGET = helloworld

最后的一个步骤就是设置 变量 由于这是一个qt的程序,我们需要把qt加入到CONFIG变量里面 以便qmake能够添加相关需要链接的qt的库和确保mocuic能包含到将要生成的Makefile里面

最后看到的完成的工程应该是下面的样子了

CONFIG += qt

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

现在你可以使用 qmake来生成你的程序需要的Makefile,在命令行里面到你的工程所在的目录输入以下的:

qmake -o Makefile hello.pro

接着输入make还是nmake 就依赖你的编译器了,如果是vs或者vc的就输入nmake,否则就输入make

对于Visual Studio使用者qmake 还可以生成 .dsp 或者.vcproj 文件 例如:

qmake -tp vc -o hello.dsp hello.pro

使得程序可调试

一个Release版本的程序没有包含任何调试符合或者其他的调试信息,在开发过程中,给程序提供调试版本的的相关信息是十分有用的.在工程文件里面的CONFIG加上debug就可以轻松做到了,例如

CONFIG += qt debug

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

qmake作用上面的的工程文件生成Makefile,你就会可以在调试环境中获取你程序运行时有用的调试信息

添加平台相关的源文件

当你编码了一段时间后,你的程序可能要做一些平台相关的东西,并且决定保持平台相关的代码独立性.因此你要做成2个新的文件来包含到你的pro文件, hellowin.cpp and hellounix.cpp 我们不能都把这2个文件添加到SOURCES变量中啊,因为将会在Makefile文件里面包含这2个文件啊.所以,我们要做的就是使用一个域的东西来使得qmake能处理这样的平台相关的问题.

假如在Windows,一个简单的域像下面那样添加进去

win32 {

SOURCES += hellowin.cpp

}

因此,如果是在Windows下运行qmake,就把hellowin.cpp添加到源文件链表里面,如果在别的平台运行qmake,就会忽略他.那么剩下来要做的就是创建一个unix平台相关的域了.

当你做完了,你的pro文件应该像下面看到的样子了

CONFIG += qt debug

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

win32 {

SOURCES += hellowin.cpp

}

unix {

SOURCES += hellounix.cpp

}

像前面一样,使用qmake来生成Makefile

如果文件不存在停止qmake

如果某写特定的文件不存在,你可能想不要创建Makefile,我们可以通过使用exists()函数检查一个文件是否存在,我们使用error()函数可以停止qmake 的处理进程.这些都是域的做法一样.只不过用函数简单的替代域.检查main.cpp文件的例子如下:

!exists( main.cpp ) {

error( “No main.cpp file found” )

}

!符号是用来否定的,例如,如果main.cpp文件存在则exists( main.cpp )结果为真.如果文件不存在!exists( main.cpp )结果则为真

CONFIG += qt debug

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

win32 {

SOURCES += hellowin.cpp

}

unix {

SOURCES += hellounix.cpp

}

!exists( main.cpp ) {

error( “No main.cpp file found” )

}

像前面一样,使用qmake来生成Makefile,如果你暂时重命名了main.cpp qmake的话,你就会看到一条消息并且qmake停止处理

多条件的检查

假如你使用Windows系统,你希望当运行程序的时候,能在命令行里面看到()输出的打印语句.除非你使用一些控制台设置来编译你的程序,否则你是看不到输出的.CONFIG变量中加入 console ,Window系统的Makefile就会有控制台的设置了,要说清楚的是,我们只想在windows系统和debug也已经添加到CONFIG里面的时候才添加控制台,这就要求两层域了,先创创建一个域,然后在里面创建另外一个域,添加设置到最里面的的域,如下

:

win32 {

debug {

CONFIG += console

}

}

嵌套的域可以用冒号来连接起来,所以最有的工程的样子就是下面的了

CONFIG += qt debug

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

win32 {

SOURCES += hellowin.cpp

}

unix {

SOURCES += hellounix.cpp

}

!exists( main.cpp ) {

error( “No main.cpp file found” )

}

win32:debug {

CONFIG += console

}

好了,你现在已经完成了qmake的旅途了,开始准备为自己的开发工程写工程文件吧

本章节讲述为3种不同类型的基于Qt的工程设置pro文件,尽管所有的工程有很多相同的变量,但是他们每个使用工程属性相关的变量来定制输出文件.

平台专门的变量不在这里讲述, 我们建议读者去 获取相关的信息, .

  • 编译一个可执行程序
    • app模板
  • 编译一个库
    • 库模板
  • 编译一个插件
    • 编译一个Qt Designer使用的插件
  • 调试模式和发布模式的编译和安装
    • 以上两种模式的编译
    • 以上两种模式的安装

编译一个可执行程序

app模板

app模板告诉qmake生成的Makefile是将要编译一个可执行程序,使用这个模板,应用程序的类型可以添加下面的选项到CONFIG变量中

选项

描述

windows

程序是Window平台的界面程序

console

App模板专用: 程序是Window平台控制台程序

当你使用这个模板,以下的一些qmake变量是能用的,你可以在pro文件使用这些变量来配置你的应用程序需要的相关的信息

  • HEADERS –程序中需要编译的头文件列表.
  • SOURCES -程序中需要编译的源文件列表.
  • FORMS – Qt Designer为程序创建的ui文件列表(qte2INTERFACES).
  • LEXSOURCES – 程序用到的所有的lex 源文件列表.
  • YACCSOURCES -程序用到的所有的yacc 源文件列表.
  • TARGET –可执行程序的名字.默认是跟工程文件名一样 (根据不同的平台后缀名会自动添加).
  • DESTDIR –可执行文件的发布目录.
  • DEFINES – 程序编译时候需要的预定义的列表
  • INCLUDEPATH –程序需要的头文件的目录列表.
  • DEPENDPATH –程序搜索的依赖路径.
  • VPATH – 查找supplied 文件的搜索路径(我还没有弄懂~_~).
  • – Windows 平台专用: 程序需要用到的.def .
  • - Windows 平台专用: 程序的资源文件.
  • - Windows 平台专用: 程序需要连接的资源文件.

你只需要使用已经设置了值的系统变量,例如,如果你没有任何额外的头文件路径 INCLUDEPATH就不用在设置什么了,qmake会自动加入qt自身需要的默认的路径,例如一个pro文件的例子可能是下面的样子

TEMPLATE = app

DESTDIR = c:/helloapp

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

DEFINES += QT_DLL

CONFIG += qt warn_on release

如果条目是单独的值,如模板或者发布目录,我们使用=,但书如果条目是多值的,我们就使用+= 来添加该类型需要添加的东西,= 来使用条目新值比如 我们使用了DEFINES=QT_DLL,所有其他的预定义就会被删除

编译一个库

库模板

lib模板告诉qmake生成的Makefile是将要编译一个库,使用这个模板的时候,另外的系统变量会加到上面app模板提到的变量,因为app模板是支持VERSION 变量,你应该在pro文件使用这些来制定一些库的库的信息

使用这个模板的时候,下面的选项可以添加到 CONFIG 变量里面来决定编译成何种库

选项

描述

dll

编译成动态库 (dll or so).

staticlib

编译成静态库.

plugin

编译成插件库,本选项意味着dll也设置了.

  • VERSION – 目标库的版本号, 2.3.1

编译成一个插件

插件的编译是使用lib模板,正如上面所描述的那样,这告诉 qmake生成的Makefile是将要编译成为每个平台都适当的形式的插件.通常是库的形式,跟普通的库一样VERSION 变量是用来指定一些有关插件的信息

  • VERSION – 目标库的版本号, 2.3.1

编译成一个Qt Designer的插件

Qt Desinger插件是用专门的配置设置来编译的,该配置设置依赖于qt的在你的系统上配置,为了方便,这些设置可以在pro里面的CONFIG加入 designer来做到,

CONFIG += designer plugin debug_and_release

请查阅 获取更多的有关插件方面的工程的例子

  • 调试模式和发布模式的编译和安装

有时候需要把工程同时编译成调试和发布模式,尽管可以使用debugrelease来设置CONFIG变量使得能够同时保持2个选项,但是debug模式会覆盖release模式

调试模式和发布模式两种模式的编译

为了是的工程能够同时在两种模式下编译,你必须在pro文件中的CONFIG变量中加入debug_and_release

CONFIG += debug_and_release

CONFIG(debug, debug|release) {

TARGET = debug_binary

} else {

TARGET = release_binary

}

上面的域中修改了每个模式的编译目标的使得最终的目标有不同的文件名,提供不同的目标名字能确保一个不会覆盖另一个

qmake处理pro文件时候,会产生一个Makefile规则来使得工程能同时在两种模式下编译,可以通过以下的方式来调用他们

make all

build_all选项能够加入到CONFIG变量中来确保默认情况下工程能被编程成两种模式

CONFIG += build_all

以下的命令就是使用用默认规则的Makefile来编译

make

调试模式和发布模式两种模式的安装

通过以下形式的命令,build_all 选项同时也能使得两个版本的目标能够被安装,

make install

如果编译目标依赖目标平台的话,可能需要自定义一下编译目标的名字;例如,库或者插件在Windows和在Unix平台使用不同的名字约定

CONFIG(debug, debug|release) {

mac: TARGET = $$join(TARGET,,,_debug)

win32: TARGET = $$join(TARGET,,d)

}

上面的目的就是在debug模式时修改编译目标的名字,你可以用同样的方法来修改release模式的目标名字

使用qmake

qmake提供工程向导系统来管理程序.库和其他的部分的编译过程.这样使得开发者可以控制源文件的使用,接下来的步骤在流程里面有简单的描述,有代表性的在一个文件里面 qmake扩展每个pro文件的信息放到Makfile里面,使得Makefile在编译阶段和连接阶段执行一些必要的命令

在本文档,我们只是基本地介绍pro文件,讲述一些qmake主要地特点,展示在命令行里面怎么使用qmake

工程的描述

工程是用pro文件内容来描述的,该文件里面的信息是被qmake用来生成Makefile, Makfile包含了编译需要的所有命令.pro文件一般包含要参与编译的源文件列表,头文件列表,常用的配置信息,和一些程序的特殊细节.比如需要连接的库 或者需要用到的额外的头文件的路径

pro文件 还可以包含许多不同的元素,比如注释啊,变量的声明啊,内部函数,和其他的一些控制语句.在一个更简单的pro文件,只是声明一些必要的的源文件和头文件再加一些基本的配置选项

完整的pro文件例子你可以在.里面找到,pro文件的入门介绍可以在章节找到.更多细节的讲述在.可以获取得到

编译工程

对于一个简单的工程,你只需在你的pro文件所在的目录运行qmake就可以了 默认的情况下 qmake生成一个编译需要的Makefile文件,接着运行你的平台的make工具(nmake或者make)来编译工程

qmake 也可以用来生成pro文件,将会在本手册的章节全面的讲述qmake的命令行选项

使用预编译头文件

在大型的工程里面 有可能用到预编译头文件来加速编译过程,这个特性将会在章节详细描述

qmake Project Files

工程文件包含了所有qmake需要编译出的应用程序,库或者插件的信息.尽管你工程里面使用的资源通常使用了一系列特殊的定义.但是可以使得不同平台环境中的不同的编译过程有了简单的程序结构.

  • 工程文件原理
    • 变量
    • 注释
    • 在函数和控制流程中编译
  • 工程模板
  • 生成选项配置
  • Qt库的声明
  • 特性配置
  • 其他需要用到的库的声明

Project File Elements工程文件原理

使用工程文件格式 使得qmake可以同时支持简单和复杂的编译系统,简单的工程文件用直截了当的风格,使用标准变量来指出需要使用的源文件和头文件,复杂的工程可能就要使用控制流程结构来使得编译过程顺畅.

以下段落讲述工程问卷使用不同的类型的原理

变量

在工程文件里面,变量是存放字符串的链表.最简单的工程文件里面,这个变量告诉qmake有关使用的配置选项,需要的文件和编译过程中用到的路径

qmake在每个pro文件里面搜索某些变量, 里面的内容决定了应该怎么写出一个Makefile,例如, HEADERS SOURCES 变量的值是用来告诉qmake要用到在pro文件相同的目录里面相关头文件和源文件

变量也可以用来存储临时的链表的值,现有的链表的值或许被新的覆盖,或许添加新的进来.

下面的说明了链表的值怎么赋给变量的

HEADERS = mainwindow.h paintwidget.h

注意,第一个赋值值只包含同一行的指定的值 第二个赋值可以用\字符隔开

下面的方法就是扩展了变量的链表的值

SOURCES = main.cpp mainwindow.cpp \

paintwidget.cpp

CONFIG += qt

CONFIG 变量是另一个qmake生成Makefile时候用到的专门的变量,将会在后面的章节讨论,上面一行qt这个值被添加到CONFIG现有的的列表的值.

下面的表格列出了qmake承认的变量,并讲述了他们应该包含什么

变量

内容

CONFIG

常用的工程配置选项.

DESTDIR

可执行文件或者二进制文件的发布目录

FORMS

uic命令要用的的ui文件列表(qt2INTERFACES)

HEADERS

编译中要用到的头文件列表

QT

Qt的特配置选项

RESOURCES

最终工程文件要包含的资源文件列表 (.rc). 里面有更多关于这些文件的信息.

SOURCES

编译工程时要用到的源文件列表

TEMPLATE

工程使用的模板. 这个决定着编译出来的结果是应用程序,还是库,或者插件.

变量的内容可以从前面的变量名中读取,通过$$符号引用,可以把一个变量的内容赋值给另一变量

TEMP_SOURCES = $$SOURCES

$$操作符号广泛的应用于函数内编译,通过他来操作字符串和列表的值,.章节有详细的讲述

通常的,变量经常包含有空格的值,有时候必须包含有空格的变量.他们必须要用引号像下面那样括起来

DEST = “Program Files”

引用的文本被看作是列表里面一个单独的项

注释

你可以在pro文件里面添加注释注释要用 # 做开头 ,例如

# Comments usually start at the beginning of a line, but they

# can also follow other content on the same line.

为了包含#字符在变量里面,有必要使用LITERAL_HASH变量,详情请看

在函数和控制流程中编译

qmake提供很多编译中的函数来使得变量中的内容能够被处理,在简单工程中最经常用到的函数是include函数,参数是文件名,给出的文件的内容在工程文件中include函数所在的位置被包含进来.include函数是通常被用来包含其他的工程文件:

include(other.pro)

通过域的作用可以支持条件结构,比如语句在编程语言:

win32 {

SOURCES += paintwidget_win.cpp

}

只有在条件为真的时候那些语句才被装配进来,在这样情况下,专门的win32 的变量必须设置,Windows系统就会自动起作用.同样在别的平台上作专门的指明,运行qmake 加上 –win32 ,也是一样的.

通过遍历链表的值使用for函数可以达到简单的循环.下面的代码就是当目录存在时,就添加目录到SUBDIRS变量里面:

EXTRAS = handlers tests docs

for(dir, EXTRAS) {

exists($$dir) {

SUBDIRS += $$dir

}

}

对变量更加复杂的操作 通常要求循环加入一些别的函数,find,uniquecount,这些函数和其他的一些别的函数通常用来提供对字符串和目录的操作.支持用户输入和调用外部工具,能使用的函数列表可以在本手册的 章节找到


阅读(1371) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~