本节内容将向大家介绍 qmake 的一些基础知识。本手册中的其他主题将包含有关使用 qmake 的更详细内容。
简单起始
假设我们已经完成了应用程序的基本实现,并创建了下列文件:
hello.cpp
hello.h
main.cpp
我们可以在 Qt 发行版的 examples/qmake/tutorial 目录中找到这些文件。 关于应用程序的设置功能,我们所需知道的另一件事是它本身是用 Qt 编写的。首先,使用我们喜欢的纯文本编辑器,在 examples/qmake/tutorial 中创建一个名为 hello.pro 的文件。 我们需要做的第一件事是添加一些脚本,这些脚本将告诉 qmake 有关开发项目的源文件和头文件信息。
我们首先将源文件添加到项目文件中。 为此,我们需要使用 SOURCES 变量。我们可以新起一行,并使用 SOURCES += hello.cpp 的方式即可添加 hello.cpp 作为源文件。
SOURCES += hello.cpp
我们对项目中的每个源文件重复这个步骤:
SOURCES += hello.cpp
SOURCES += main.cpp
如果我们更喜欢使用 Make-like 的语法:把所有的文件都在一行中列出,我们可以像下面这样使用换行转义的方式:
SOURCES = hello.cpp \
main.cpp
现在源文件已列在项目文件中,接下来我们添加头文件。头文件的添加方式与源文件完全相同,只是我们使用的变量名是 HEADERS。完成此操作后,我们的项目文件类似下面所示:
HEADERS = hello.h
SOURCES = hello.cpp \
main.cpp
目标文件名称是自动设置的。它一般与项目文件名相同,并带有适合平台的后缀。例如,如果项目文件被称为 hello.pro,目标文件的名称在 Windows 平台上将是 hello.exe,而在 Unix 平台上将是 hello。如果我们想使用一个自定义的名字,我们可以在项目文件中,使用 TARGET 变量,并添加类似下面的脚本进行设置(建议将这个设置放在项目文件的起始处):
TARGET = helloworld
之后完成的项目文件类似下面这样:
TARGET = helloworld
HEADERS = hello.h
SOURCES = hello.cpp \
main.cpp
现在可以使用 qmake 为这个应用程序生成 Makefile 文件了。启动命令行,并进入项目文件所在的目录中,然后键入以下内容:
qmake -o Makefile hello.pro
然后我们可以键入 make(或 nmake)来完成编译。
对于 Visual Studio 用户,qmake 也可以用来生成 Visual Studio 项目文件。 其命令如下:
qmake -tp vc hello.pro
使程序可调式
应用程序的发行版一般不需要包含任何调试符号或其他调试信息。但是在开发过程中,使用应用程序带有相关信息的调试版本非常有用。 通过将 debug 添加给项目文件中的 CONFIG 变量,可以轻松实现此目的。例如:
TARGET = helloworld
HEADERS = hello.h
SOURCES = hello.cpp \
main.cpp
CONFIG += debug
我们还是像之前一样使用 qmake 来生成 Makefile。现在,在调试环境中运行应用程序时,我们将获得有关应用程序有用的调试信息。
添加平台相关的源文件
现在假设我们有两个新文件要包含到项目文件中:hellowin.cpp 和 hellounix.cpp。我们不能仅仅将它们添加到 SOURCES 变量中就完事了,因为这会将两个文件都放在 Makefile 中。 因此,我们在这里需要做的是使用一个作用域,它将根据我们为哪个平台构建而被进入并处理内部的脚本。
为 Windows 添加平台相关文件的简单作用域示例如下:
win32 {
SOURCES += hellowin.cpp
}
在为 Windows 平台构建时,qmake 将 hellowin.cpp 添加到源文件列表中。在为任何其他平台构建时,qmake 都会忽略它。现在剩下的工作就是为特定于 unix 平台的文件创建一个作用域。
完成之后,我们的项目文件将类似下面这样:
TARGET = helloworld
HEADERS = hello.h
SOURCES = hello.cpp \
main.cpp
CONFIG += debug
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" )
}
! 符号用于对检测结果取反。也就是说,如果文件存在,exists( main.cpp ) 为真;如果文件不存在,!exists( main.cpp ) 为真。
TARGET = helloworld
HEADERS = hello.h
SOURCES = hello.cpp \
main.cpp
CONFIG += debug
win32 {
SOURCES += hellowin.cpp
}
unix {
SOURCES += hellounix.cpp
}
!exists( main.cpp ) {
error( "No main.cpp file found" )
}
像以前一样使用 qmake 来生成 makefile。如果我们临时重命名 main.cpp 文件,我们将看到错误提示消息,qmake 将停止继续处理。
检测多个条件
假设我们正在使用 Windows 平台,并且希望在命令行上运行应用程序时能够使用 qDebug() 查看语句输出。要查看输出,必须使用适当的控制台设置来构建应用程序。我们可以通过将 console 添加到 CONFIG 变量中很容易地实现这个设置,这样在 Windows 的 Makefile 中就会包含此设置。但是,我们假设只在运行 Windows 和已经在 CONFIG 变量上添加了 debug 时才添加 console 到 CONFIG 变量 。这时就需要使用两个相互嵌套的作用域。我们把要处理的设置放在第二个左右域内,像下面这样:
win32 {
debug {
CONFIG += console
}
}
嵌套的作用域可以用冒号连接在一起,所以最终的项目文件会类似下面这样:
TARGET = helloworld
HEADERS = hello.h
SOURCES = hello.cpp \
main.cpp
CONFIG += debug
win32 {
SOURCES += hellowin.cpp
}
unix {
SOURCES += hellounix.cpp
}
!exists( main.cpp ) {
error( "No main.cpp file found" )
}
win32:debug {
CONFIG += console
}
如大家所见,这还是挺容易的!现在,我们已经完成了qmake 的入门教程,并可以开始为开发项目编写项目文件了。
网友评论