构建常见的项目类型

本章将介绍如何为基于 Qt 的三种常见项目类型设置 qmake 项目文件:应用程序、库和插件。尽管所有项目类型都使用许多相同的变量,但每种类型都使用特定于项目的变量来定制输出文件。

这里不介绍特定于平台的变量。更多信息,请参阅Windows 版 Qt - 部署macOS 版 Qt

构建应用程序

app 模板会告诉 qmake 生成一个 Makefile 来构建应用程序。使用此模板,可通过在CONFIG变量定义中添加以下选项之一来指定应用程序的类型:

选项说明
窗口应用程序是 Windows GUI 应用程序。
控制台app 仅模板:应用程序是 Windows 控制台应用程序。
测试用例应用程序是一个自动测试

使用此模板时,会识别以下 qmake 系统变量。您应在 .pro 文件中使用这些变量来指定应用程序的相关信息。有关其他与平台相关的系统变量,请参阅平台说明。

  • HEADERS- 应用程序的头文件列表。
  • SOURCES- 应用程序的 C++ 源文件列表。
  • FORMS- 应用程序的用户界面文件列表(使用Qt Widgets Designer 创建)。
  • LEXSOURCES- 应用程序的 Lex 源文件列表。
  • YACCSOURCES- 应用程序的 Yacc 源文件列表。
  • TARGET- 应用程序的可执行文件名称。默认为项目文件的名称。(如果有扩展名,会自动添加)。
  • DESTDIR- 目标可执行文件所在的目录。
  • DEFINES- 应用程序所需的附加预处理器定义列表。
  • INCLUDEPATH- 应用程序所需的其他包含路径列表。
  • DEPENDPATH- 应用程序的依赖搜索路径。
  • VPATH- 查找所提供文件的搜索路径。
  • DEF_FILE- 仅适用于 Windows:应用程序要链接的 .def 文件。

您只需使用有值的系统变量。例如,如果没有额外的 INCLUDEPATH,则无需指定。一个项目文件示例如下

TEMPLATE = app
DESTDIR  = c:/helloapp
HEADERS += hello.h
SOURCES += hello.cpp
SOURCES += main.cpp
DEFINES += USE_MY_STUFF
CONFIG  += release

对于单值项目,如模板或目标目录,我们使用"=";但对于多值项目,我们使用 "+="来添加到现有的该类型项目中。使用"="可以将变量值替换为新值。例如,如果我们写入DEFINES=USE_MY_STUFF ,所有其他定义都会被删除。

构建测试用例

测试用例项目是一个app 项目,旨在作为自动测试运行。任何app 都可以通过在CONFIG 变量中添加testcase 的值来标记为测试用例。

对于测试用例项目,qmake 会在生成的 Makefile 中插入一个check 目标。该目标将运行应用程序。如果测试以等于零的退出代码结束,则认为测试通过。

check 目标会自动遍历SUBDIRS项目。这意味着可以在 SUBDIRS 项目中发出make check 命令来运行整个测试套件。

check 目标的执行可以通过某些 Makefile 变量进行定制。这些变量是

变量说明
TESTRUNNER每个测试命令前的命令或 shell 片段。例如,"超时 "脚本会在指定时间内未完成测试时终止测试。
测试参数附加到每个测试命令的额外参数。例如,传递附加参数来设置测试的输出文件和格式(如QTestLib 支持的-o filename,format 选项)可能很有用。

注意: 变量必须在调用make 工具时设置,而不是在 .pro 文件中设置。大多数make 工具都支持直接在命令行上设置 Makefile 变量:

# Run tests through test-wrapper and use JUnit XML output format.
# In this example, test-wrapper is a fictional wrapper script which terminates
# a test if it does not complete within the amount of seconds set by "--timeout".
# The "-o result.xml,junitxml" options are interpreted by QTestLib.
make check TESTRUNNER="test-wrapper --timeout 120" TESTARGS="-o result.xml,junitxml"

可使用以下CONFIG 选项进一步定制测试用例项目:

选项说明
insignificant_testmake check 时,测试的退出代码将被忽略。

测试用例通常使用QTestTestCase 编写,但并不要求使用CONFIG+=testcasemake check 。唯一的主要要求是,测试程序成功时的退出代码为零,失败时的退出代码非零。

构建程序库

lib 模板告诉 qmake 生成一个 Makefile 来构建一个库。使用此模板时,除了app 模板支持的系统变量外,还支持VERSION变量。在 .pro 文件中使用这些变量来指定有关库的信息。

使用lib 模板时,可在CONFIG变量中添加以下选项,以确定构建的库类型:

选项说明
dll该库是共享库 (dll)。
staticlib该库为静态库。
插件该库是一个插件。

还可定义以下选项,以提供有关库的其他信息。

  • VERSION - 目标库的版本号。例如,2.3.1。

库的目标文件名取决于平台。例如,在 X11、macOS 和 iOS 上,库名前缀为lib 。在 Windows 上,文件名不加前缀。

构建插件

如上一节所述,插件是使用lib 模板构建的。这将告诉 qmake 为项目生成 Makefile,以适合每个平台的形式(通常是库的形式)构建插件。与普通库一样,VERSION变量用于指定插件的相关信息。

  • VERSION - 目标库的版本号。例如,2.3.1。

构建Qt Widgets Designer 插件

Qt Widgets Designer 插件是使用一组特定的配置设置构建的,这些设置取决于 Qt 在系统中的配置方式。为方便起见,可通过在Qt变量中添加 来启用这些设置。例如designer

QT          += widgets designer

有关基于插件的项目的更多示例,请参阅Qt Widgets Designer Examples

在调试模式和发布模式下构建和安装

有时,需要在调试模式和发布模式下构建项目。虽然CONFIG变量可以包含debugrelease 选项,但只有最后指定的选项才会被应用。

以两种模式构建

要使项目同时以两种模式构建,必须在CONFIG 变量中添加debug_and_release 选项:

CONFIG += debug_and_release

CONFIG(debug, debug|release) {
    TARGET = debug_binary
} else {
    TARGET = release_binary
}

上述代码段中的作用域修改了每种模式下的构建目标,以确保生成的目标具有不同的名称。为目标提供不同的名称可确保一个目标不会覆盖另一个目标。

当 qmake 处理项目文件时,它会生成一条 Makefile 规则,允许在两种模式下编译项目。调用方法如下:

make all

可以在项目文件的CONFIG 变量中添加build_all 选项,以确保项目默认以两种模式联编:

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)
}

上述代码段的默认行为是在调试模式下构建时修改构建目标的名称。可以在作用域中添加else 子句,以便在发布模式下执行同样的操作。如果保持原样,目标名称将保持不变。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.