qmake是一个帮助在不同平台上简化编译步骤的工具,她是来自Trolltech,qmake能够自动生成Makefile 使得只需要少量的信息就可以创建相应的Makefile,qmake能用于很多的软件工程,不管该软件工程是否是用qt写的.
qmake能生成Makefile主要是以工程文件里面的信息为基础.工程文件是开发者创建的,通常是很简单的.但是一些复杂的工程需要创建复杂的工程文件文件,qmake包含别的特性来支持qt开发.自动的包含uic和moc的编译规则.qmake也可以生成Microsoft Visual studio的工程文件而不要求开发者改变qt的工程文件
Getting Started 开始把
qmake指南 和 qmake 常用工程 提供了浏览,以便帮助新手开始qmake的使用
下面的就是连接了…
- qmake Tutorial qmake指南
- Starting off Simple 从简单易懂开始
- Making an Application Debuggable 使得程序可调试
- Adding Platform-Specific Source Files 添加特殊平台的源文件
- Stopping qmake If a File Doesn’t Exist 停止qmake如果文件不存在
- Checking for More than One Condition 检查更多条件
- qmake Common Projects
- Building an Application 编译成可执行程序
- The app Template app模板
- Building a Library 编译成库
- The lib Template 库模板
- Building a Plugin 编译成插件
- Building a Qt Designer Plugin 编译成qt designer的插件
- Building and Installing in Debug and Release Modes 调试模式和发布模式的编译和安装
- Building in Both Modes 两种模式同时编译
- Installing in Both Modes 两种模式同时安装
- Building an Application 编译成可执行程序
qmake指南
本指南教导你怎么使用qmake,我们建议你看完了本指南后去阅读一下qmake用户手册
从简单易懂的开始
我们假设你完成了一个你的程序基本文件建立.比如下面的文件
- hello.cpp
- hello.h
- main.cpp
你可以在你的qt的安装目录的examples/qmake/tutorial里面找到这些文件.首先使用一个你喜欢的编辑器创建一个叫hello.pro的文件,第一件你要做的事情是添加一行字 来告诉qmake 关于头文件和源文件是你的工程的组成部分
我们将先添加源文件到工程文件,你需要使用SOURCES 变量来做这件事情.新起一行写上 SOURCES += 后面跟着hello.cpp 例如
SOURCES += hello.cpp
我们重复做同样的事情 来添加源文件到工程文件里面,最后就成了下面的样子
SOURCES += hello.cpp
SOURCES += main.cpp
如果你喜欢使用Makefile的语法风格,可以写成下面的形式
SOURCES = hello.cpp /
main.cpp
现在源文件已经列在了工程文件里面了,接下来添加头文件,他们也是用同样的方法添加,不同的是变量名是HEADERS
做了这步的话,我们的工程文件应该是下面的样子了
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
一般情况下编译出来的目标的名字自动设置成跟工程文件名一样的名字,但是根据不同的系统加上了适当的后缀名,比如,你的工程文件名叫hello.pro那么目标在windows就是hello.exe而在Unix就是hello,如果你想使用一个不同的名字,你可以在工程文件名里面加入以下设置
TARGET = helloworld
最后的一个步骤就是设置 CONFIG 变量 由于这是一个qt的程序,我们需要把qt加入到CONFIG变量里面 以便qmake能够添加相关需要链接的qt的库和确保moc和uic能包含到将要生成的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系统,你希望当运行程序的时候,能在命令行里面看到qDebug()输出的打印语句.除非你使用一些控制台设置来编译你的程序,否则你是看不到输出的.在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的旅途了,开始准备为自己的开发工程写工程文件吧
qmake Common Projects
本章节讲述为3种不同类型的基于Qt的工程设置pro文件,尽管所有的工程有很多相同的变量,但是他们每个使用工程属性相关的变量来定制输出文件.
平台专门的变量不在这里讲述, 我们建议读者去 Deploying Qt Applications 获取相关的信息,如 building universal binaries for Mac OS X 和handling Visual Studio manifest files.
- Building an Application 编译一个可执行程序
- The app Template app模板
- Building a Library 编译一个库
- The lib Template 库模板
- Building a Plugin 编译一个插件
- Building a Qt Designer Plugin 编译一个Qt Designer使用的插件
- Building and Installing in Debug and Release Modes 调试模式和发布模式的编译和安装
- Building in Both Modes 以上两种模式的编译
- Installing in Both Modes 以上两种模式的安装
编译一个可执行程序
app模板
app模板告诉qmake生成的Makefile是将要编译一个可执行程序,使用这个模板,应用程序的类型可以添加下面的选项到CONFIG变量中
选项 |
描述 |
windows |
程序是Window平台的界面程序 |
console |
App模板专用: 程序是Window平台控制台程序 |
当你使用这个模板,以下的一些qmake变量是能用的,你可以在pro文件使用这些变量来配置你的应用程序需要的相关的信息
- HEADERS –程序中需要编译的头文件列表.
- SOURCES -程序中需要编译的源文件列表.
- FORMS – 由Qt Designer为程序创建的ui文件列表(qte2是INTERFACES).
- LEXSOURCES – 程序用到的所有的lex 源文件列表.
- YACCSOURCES -程序用到的所有的yacc 源文件列表.
- TARGET –可执行程序的名字.默认是跟工程文件名一样 (根据不同的平台后缀名会自动添加).
- DESTDIR –可执行文件的发布目录.
- DEFINES – 程序编译时候需要的预定义的列表
- INCLUDEPATH –程序需要的头文件的目录列表.
- DEPENDPATH –程序搜索的依赖路径.
- VPATH – 查找supplied 文件的搜索路径(我还没有弄懂~_~).
- DEF_FILE – Windows 平台专用: 程序需要用到的.def .
- RC_FILE - Windows 平台专用: 程序的资源文件.
- RES_FILE - 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
请查阅Qt Designer examples 获取更多的有关插件方面的工程的例子
- 调试模式和发布模式的编译和安装
有时候需要把工程同时编译成调试和发布模式,尽管可以使用debug和release来设置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文件例子你可以在qmake Tutorial.里面找到,pro文件的入门介绍可以在qmake Project Files章节找到.更多细节的讲述在qmake Reference.可以获取得到
编译工程
对于一个简单的工程,你只需在你的pro文件所在的目录运行qmake就可以了 默认的情况下 qmake生成一个编译需要的Makefile文件,接着运行你的平台的make工具(nmake或者make)来编译工程
qmake 也可以用来生成pro文件,将会在本手册的Running qmake章节全面的讲述qmake的命令行选项
使用预编译头文件
在大型的工程里面 有可能用到预编译头文件来加速编译过程,这个特性将会在Using Precompiled Headers章节详细描述
qmake Project Files
工程文件包含了所有qmake需要编译出的应用程序,库或者插件的信息.尽管你工程里面使用的资源通常使用了一系列特殊的定义.但是可以使得不同平台环境中的不同的编译过程有了简单的程序结构.
- Project File Elements 工程文件原理
- Variables 变量
- Comments 注释
- Built-in Functions and Control Flow 在函数和控制流程中编译
- Project Templates 工程模板
- General Configuration 生成选项配置
- Declaring Qt Libraries Qt库的声明
- Configuration Features 特性配置
- Declaring Other Libraries 其他需要用到的库的声明
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时候用到的专门的变量,将会在后面的general configuration章节讨论,上面一行qt这个值被添加到CONFIG现有的的列表的值.
下面的表格列出了qmake承认的变量,并讲述了他们应该包含什么
变量 |
内容 |
CONFIG |
常用的工程配置选项. |
DESTDIR |
可执行文件或者二进制文件的发布目录 |
FORMS |
uic命令要用的的ui文件列表(qt2是INTERFACES) |
HEADERS |
编译中要用到的头文件列表 |
QT |
Qt的特配置选项 |
RESOURCES |
最终工程文件要包含的资源文件列表 (.rc). The Qt Resource System里面有更多关于这些文件的信息. |
SOURCES |
编译工程时要用到的源文件列表 |
TEMPLATE |
工程使用的模板. 这个决定着编译出来的结果是应用程序,还是库,或者插件. |
变量的内容可以从前面的变量名中读取,通过$$符号引用,可以把一个变量的内容赋值给另一变量
TEMP_SOURCES = $$SOURCES
$$操作符号广泛的应用于函数内编译,通过他来操作字符串和列表的值,在qmake Advanced Usage.章节有详细的讲述
通常的,变量经常包含有空格的值,有时候必须包含有空格的变量.他们必须要用引号像下面那样括起来
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变量,详情请看variable reference
在函数和控制流程中编译
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,unique和count,这些函数和其他的一些别的函数通常用来提供对字符串和目录的操作.支持用户输入和调用外部工具,能使用的函数列表可以在本手册的 qmake Advanced Usage 章节找到
工程模板
TEMPLATE 变量是用来定义要编译的工程的类型,如果没有在工程文件里面声明,qmake将会默认是一个应用程序的工程,并生成适当的Makefile.
下面的表格列出了工程的可用的模板类型并加以说明
模板 |
qmake输出描述 |
app (default) |
创建 Makefile文件用来编译出应用程序(默认值). |
lib |
创建 Makefile文件用来编译出库. |
subdirs |
创建 Makefile文件包含SUBDIRS 变量指定的目录. 每个子目录必须有自己的pro文件 |
vcapp |
创建 Visual Studio 工程文件用来编译出应用程序.(仅Windows) |
vclib |
创建 Visual Studio 工程文件用来编译出. (仅Windows) |
请看qmake Tutorial 里面的建议,那里说了用app和lib模板写工程文件
当使用subdirs模板时候,qmake生成的Makefile扩展每个指定的子目录,处理子目录里面的工程文件,并运行平台中的make工具生成各自子目录里面新的 Makefile,SUBDIRS变量是用来包含要编译的子目录的列表
生成选项配置
CONFIG变量是指定编译器应该使用的选项和特性,以及需要连接的库.可以加任何东西到CONFIG里面,但是只有下面提到的选项能被qmake认出来,下面的选项控制了编译器的选项
选项 |
描述 |
release |
工程用发布模式编译. 如果指定了debug选项,本选项会被忽略. |
debug |
工程用调试模式编译. |
debug_and_release |
工程同时用调试和发布模式编译. |
build_all |
如果指定是 debug_and_release 模式,工程默认是同时用调试和发布模式编译. |
ordered |
使用subdirs 模板时, 本选项指定了子目录应该按照给出的顺序编译. |
warn_on |
告诉编译器应该输出尽量多的警告. 如果用了 warn_off.本选项被忽略 |
warn_off |
告诉编译器输出尽量少的编译警告. |
Debug_and_release 选项是指定了调试版本和发布版本能够透视编译.在这样的情况下,qmake生成的Makefile包含了两个版本的编译规则.通过下面的命令可以调用他们
make all
添加build_all 选项到CONFIG 变量里面使得这个规则在编译时候是默认的,并且安装目标也会创建2种模式的编译.
要注意的是,每个在CONFIG变量指定的选项可以用在某些域里面.你可以通过使用CONFIG()函数来测试某些配置选项.例如,下面的代码演示了函数的功能.域里面的条件是只有使用了了opengl选项才有用.
CONFIG(opengl) {
message(Building with OpenGL support.)
} else {
message(OpenGL support is not available.)
}
这样可以使得发布版本和调试版本定义不同的配置,更多详细的介绍在本手册的Advanced Usage 章节里面的Scopes部分
下面的选项定义了工程要编译的类型.注意下面的有些选项只能在特定平台使用才有作用.在别的平台没有作用的..
选项 |
描述 |
qt |
工程是qt的程序,而且自动连接一些qt的库. 你可以使用QT 变量来控制任何你的程序需要的额外的Qt模块 |
thread |
程序支持多线程. |
x11 |
工程是X11程序或者库. |
当使用应用程序或者工程模板 时候,需要使用更多的指定的配置使得编译过程顺利进行,将会在本手册的Common Projects 章节里面做更详细的解释
例如你的程序想用qt的库,要求是多线程程序,而且是调试模式的,可以写成下面的
CONFIG += qt thread debug
注意,你必须使用 “+=”而不是“=”,否则qmake不能使用qt的配置来决定你的工程需要的设置.
声明Qt库模块
如果CONFIG变量包含了 qt 这个值,qmake支持了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选项
配置特性
qmake可以通过专门的prf文件设置另外的配置特性.这些特性通常提供给编译时候的自定义的工具使用.为了在处理过程添加一个特性,往CONFIG变量里面添加一个特性名字,该名字跟特性的文件名相同(mkspecs/features目录里面)
例如 qmake可以在编译过程利用pkg-config 提供支持的额外的库,例如D-Bus库 和 ogg库,用下面的方法
CONFIG += link_pkgconfig
PKGCONFIG += ogg dbus-1
关于这些特性的介绍的更多信息,会在qmake高级阶段的Adding New Configuration Features章节做介绍
声明其他的库
如果你需要在工程中使用其他的库,你需要在工程文件里面指定
让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的行为,这样使得编译过程更协调,提供更有用的诊断信息,并能够使你的工程用于指定的目标平台
Command-Line Options 命令行选项
o Syntax 语法
o Options 选项
o Makefile Mode Options Makefile模式选项
o Project Mode Options project模式选项
命令行选项
语法
用来运行qmake的语法如下
qmake [mode] [options] files
qmake支持两种不同模式的操作,默认情况下,qmake将会使用project中的配置来生成Makefile文件,但是也可以用qmake生成pro文件.如果你想明确的设置选项,你必须在所有其他的选项前指定,模式可以是下面的其中之一的值
-makefile
qmake将输出一个Makefile文件.
-project
qmake将输出一个pro文件.
下面的选项用来同时指定生成和特殊模式设置.只用于Makefile模式的选项列在了Makefile Mode Options 部分讲述;影响pro文件创建的选项在Project File Options 部分说明
文件参数是列出了一个或者多个工程文件(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(就是上面的那个啊,是指代,不是说就是用tmpl~_~)来重写TEMPLATE变量的任何设置, 但只在pro文件被处理之后.
· -tp prefix
qmake将添加prefix(也是指代上面的,不是prefix这个本身~_~)到TEMPLATE变量里面.
调整警告信息的级别能够帮助你找到pro文件的问题所在:
· -Wall
qmake将会报告所有知道的警告信息.
· -Wnone
qmake不产生任何警告信息.
· -Wparser
qmake只产生词法分析的警告.在解析你的pro文件的时候会警告你一些普通的缺陷和潜在问题.
· -Wlogic
qmake警告你在pro文件存在一些普通的缺陷和潜在问题. 例如, qmake会报告你相同文件是否在一个文件列表里面出现多次,或者文件找不到
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选项之后会被延迟,直到指定的文件传进来了(我也没有用过,不知道他说什么,也不要管我在说什么o~_^o)
Project Mode Options
qmake -project [options] files
在工程模式,qmake将会生成pro文件.另外,你可以在本模式下添加下面的选项:
· -r
qmake将会遍历目录
· -nopwd
qmake将会不理会你当前工作目录的源代码文件而去使用指定的文件
在这个模式.files变量可以是文件或者目录的列表 如果指定一个目录,将会包含进DEPENDPATH变量里面 目录里面相关的代码会被包含进生成的工程文件里面. 如果给的是文件, 将会添加到正确的变量, 这主要依赖于他们的扩展名(后缀名); 例如, .ui 文件会被添加到 FORMS(qt2是INTERFACES吧), .cpp 文件会被添加到 SOURCES.
在这个模式下.你也可以传递任务到命令行里面, 当这样做的时候,这些任务将会放到生成pro文件之后.
qmake Platform Notes qmake不同平台时要注意的
qmake基本的配置特征能够处理很多跨平台的工程. 在某些平台,利用平台的特性是有用的, 有时候甚至是必需的.qmake知道很多这些特性, 通过专门的变量能够取到这些特性,并只有在相关的平台上才起作用.
· Mac OS X
o Using Frameworks
o Creating Library Bundles
o Creating Frameworks
o Creating Universal Binaries
o Creating and Moving Xcode Projects
· Windows
o Creating Visual Studio Project Files
o Visual Studio 2005 Manifest Files
只翻译windows部分吧.苹果的还是不要翻译先…….
Windows
这个平台的特征包含支持创建Visual Studio 工程文件,当发布使用Visual Studio 2005开发qt应用程序时候处理列表文件(manifest files??).
Creating Visual Studio Project Files
开发者使用 Visual Studio 写qt用于程序时候,可以使用Visual Studio 插件工具提供的方便 (但是只有商业版本的qt才可以用 Qt Commercial Editions )而无需担心工程怎么管理相关的依赖.
尽管如此, 一些开发者可能需要把qt工程导入到Visual Studio. Qmake是可以用一个工程文件创建Visual Studio工程并包含所有的开发环境要求的必要的信息通过设置工程模板 (project template ) 是vcapp (应用程序工程) 或者是 vclib (库工程).
也可以通过命令行选项来设置:
qmake -t vcapp
要注意的是,每次你更新或修改了你的工程文件,你必须要用上面的命令生成相应的更新的Visual Studio工程文件.更重要的是,这个命令在开源版本也可以用
Visual Studio 2005 Manifest Files
当发布一个用 Visual Studio 2005 编译的qt应用程序时, 有必要确保当应用程序被连接时候创建的 manifest(列表??) 文件被正确处理, 生成dll的工程能自动的处理, 但是有必要明确的知道 manifest 嵌入应用程序执行 可以通过下面的样子添加 CONFIG 变量做到:
CONFIG += embed_manifest_exe
详细的讨论将会在 Windows系统中qt程序发布向导 deployment guide for Windows.看到