这个教程教您qmake的基础知识。这份手册中的其他主题包含了关于使用qmake的更详细信息。

1 从简单开始

假设您刚完成了应用程序的基本实现,并且创建了以下文件:

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

您会在Qt发行版的examples/qmake/tutorial目录中找到这些文件。关于应用程序的设置,您只知道它是用Qt编写的。首先,使用您喜欢的纯文本编辑器,在examples/qmake/tutorial中创建一个名为hello.pro的文件。您需要做的第一件事是添加告诉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

完成的项目文件应如下所示:

HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp

现在您可以使用qmake为您的应用程序生成Makefile。在命令行中,您的项目目录中,键入以下内容:

qmake -o Makefile hello.pro

注意:如果您通过包管理器安装Qt,二进制文件可能是qmake6。

然后根据您使用的编译器键入make或nmake。

对于Visual Studio用户,qmake还可以生成Visual Studio项目文件。例如:

qmake -tp vc hello.pro

注意:如果您通过包管理器安装Qt,二进制文件可能是qmake6。

然后根据您使用的编译器键入make或nmake。

对于Visual Studio用户,qmake还可以生成Visual Studio项目文件。例如:

qmake -tp vc hello.pro

2 使应用程序可调试

应用程序的发布版本不包含任何调试符号或其他调试信息。在开发过程中,生成带有相关信息的应用程序的调试版本是有用的。这可以通过在项目文件中的CONFIG变量中添加debug轻松实现。

例如:

CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp

像之前一样使用qmake生成Makefile。现在,在调试环境中运行应用程序时,您将获得有关应用程序的有用信息。

3 添加平台特定的源文件

经过几个小时的编码后,您可能已开始编写应用程序的平台特定部分,并决定将平台依赖的代码分开。因此,您现在有两个新文件要包含在您的项目文件中:hellowin.cpp和hellounix.cpp。我们不能只是将这些添加到SOURCES变量中,因为这会将两个文件都放入Makefile中。因此,我们需要做的是使用一个范围,这将根据我们为哪个平台构建而处理。

为Windows添加平台依赖文件的简单范围如下所示:

win32 {
    SOURCES += hellowin.cpp
}

在为Windows构建时,qmake将hellowin.cpp添加到源文件列表中。在为任何其他平台构建时,qmake简单地忽略它。现在剩下的就是为Unix特定文件创建一个范围。

完成后,您的项目文件应如下所示:

CONFIG += debug
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
win32 {
    SOURCES += hellowin.cpp
}
unix {
    SOURCES += hellounix.cpp
}

像之前一样使用qmake生成Makefile。

4 如果文件不存在则停止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将停止处理。

5 检查多个条件

假设您使用Windows,并且希望在命令行上运行应用程序时能够看到qDebug()的语句输出。要看到输出,您必须使用适当的控制台设置构建应用程序。我们可以轻松地将console放在CONFIG行上,以在Windows上将此设置包含在Makefile中。然而,假设我们只想在运行Windows且CONFIG行上已经有debug时添加CONFIG行。这需要使用两个嵌套的范围。首先创建一个范围,然后在其内部创建另一个。将要处理的设置放在第二个范围内,如下所示:

win32 {
    debug {
        CONFIG += console
    }
}

嵌套范围可以使用冒号连接在一起,因此最终的项目文件看起来像这样:

就这样!您现在已经完成了qmake教程,并准备好为您的开发项目编写项目文件。

6 参考

Getting Started with qmake:https://doc.qt.io/qt-6/qmake-tutorial.html