Qt扫盲-QMake 使用概述
QMake 使用概述
- 一、概述
- 二、简单开始
- 三、使应用程序可调试
- 1. 添加平台特定的源文件
- 2. 如果文件不存在,停止qmake
- 3. 检查多个条件
一、概述
本教程教你qmake的基础知识。qmake 其实就是一个自动化编译的流程控制文件,也是Qt程序的生成makefile的工具,qmake 其实就是来解析 Qt Pro文件的一个程序,基本上我们主要还是通过 编写 pro 工程文件,然后调用 qmake 命令来生成Makefile, 最后生成可执行文件的过程。qmake 其实就是和 cmake 一样的,生成一个Makefile 的工具。只是qmake 是qt 提供的一个跨平台 生成Makefile的软件,我一般也是用 qmake 多些,因为更简单些。
二、简单开始
让我们假设您刚刚完成了应用程序的基本实现,并创建了以下文件:
- hello.cpp
- hello.h
- main.cpp
我们需要做的第一件事是添加告诉 qmake 作为开发项目一部分的源文件和头文件的行。
即是通过设置一些变量来完成的。
我们首先将源文件添加到项目文件中。为此,您需要使用 SOURCES 变量。只需用 SOURCES += 开始新一行,并在其后加上hello.cpp。你应该有这样的东西:
SOURCES += hello.cpp
我们可以对项目中的每个源文件重复这一步骤,直到得到如下结果:
SOURCES += hello.cpp
SOURCES += main.cpp
如果你更喜欢使用类似make的语法,你可以使用换行转义,就像这样:
SOURCES = hello.cpp \main.cpp
既然源文件已经在项目文件中列出,那么必须添加头文件。添加这些文件的方式与源文件完全相同,只是我们使用的变量名是 HEADERS。
一旦你这样做了,你的项目文件应该看起来像这样:
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
生成的目标名称将自动设置。它与项目文件名相同,但具有适合于平台的后缀。例如,如果项目文件名为 hello.pro 在Windows上目标是hello.exe,在Unix上目标是hello。
如果你想使用不同的名称,你可以在项目文件中通过 TARGET 来设置这个可执行文件名叫 helloworld :
TARGET = helloworld
完成的项目文件应该是这样的:
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
下面生成这些的命令我们可以了解就行,基本上我们都是在GUI的Qt Creator IDE下开发,我们只需要点击 运行 按钮就能运行出结果啦。
现在可以使用qmake为应用程序生成Makefile。在命令行中,在项目目录中,键入以下命令:
qmake -o Makefile hello.pro
然后根据你使用的编译器输入make或nmake。
对于Visual Studio用户,qmake还可以生成Visual Studio项目文件。例如:
qmake -tp vc hello.pro
三、使应用程序可调试
应用程序的发布版本不包含任何调试符号或其他调试信息。在开发过程中,生成具有相关信息的应用程序的调试版本是很有用的。通过向项目文件中的 CONFIG 变量添加 debug ,可以轻松实现这一点。
例如:
CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
像以前一样使用qmake生成Makefile。现在,在调试环境中运行应用程序时,您将获得有关应用程序的有用信息。
1. 添加平台特定的源文件
经过几个小时的编码之后,您可能已经开始了应用程序中特定于平台的部分,并决定将依赖于平台的代码分开。
现在有两个新文件要包含到项目文件中:helloin .cpp和hellounix.cpp。我们不能仅仅将这些文件添加到SOURCES变量中,因为这会将两个文件都放在Makefile中。因此,我们在这里需要做的是使用一个作用域,它将根据我们为哪个平台构建而被处理。
为Windows添加平台相关文件的简单作用域如下所示:
win32 {SOURCES += hellowin.cpp
}
当构建Windows时,qmake将helloin .cpp添加到源文件列表中。在为其他平台构建时,qmake会忽略它。现在剩下要做的就是为特定于unix的文件创建一个作用域。
当你这样做了,你的项目文件应该看起来像这样:
CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp# windows
win32 {SOURCES += hellowin.cpp
}# 类unix 包含 Linux
unix {SOURCES += hellounix.cpp
}
这个就是条件编译一样,也会像以前一样使用qmake生成Makefile。
2. 如果文件不存在,停止qmake
如果某个文件不存在,您可能不想创建Makefile。我们可以使用exists()函数来检查文件是否存在。我们可以使用error()函数停止qmake的处理。这与作用域的工作方式相同。只需将作用域条件替换为函数。一个名为main.cpp的文件的检查是这样的:
!exists( main.cpp ) {error( "No main.cpp file found" )
}
!符号用于否定测试。也就是说,如果文件存在,exists(main.cpp)为真,如果文件不存在,!exists(main.cpp)为真。
CONFIG += 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将停止处理。
3. 检查多个条件
假设你使用的是Windows,你希望在命令行中运行应用程序时能够通过qDebug()看到语句输出。要查看输出,您必须使用适当的控制台设置构建应用程序。在Windows上,我们可以轻松地将console放在配置行中,在Makefile中包含此设置。然而,假设我们只想在Windows上运行且debug已经在配置行中时添加配置行。这需要使用两个嵌套作用域。首先创建一个作用域,然后在其中创建另一个作用域。将需要处理的设置放在第二个作用域中,如下所示:
win32 {debug {CONFIG += console}}
嵌套的作用域可以用冒号连接在一起,因此最终的项目文件如下所示:
CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cppwin32 {SOURCES += hellowin.cpp
}unix {SOURCES += hellounix.cpp
}!exists( main.cpp ) {error( "No main.cpp file found" )
}win32:debug {CONFIG += console
}