AUTOMOC

目标是否应使用 auto-moc (用于 Qt 项目) 进行处理。

AUTOMOC 是一个布尔值,用于指定 CMake 是否会自动处理 Qt moc 预处理器,即无需使用诸如 QT4_WRAP_CPP()qt5_wrap_cpp() 等命令。目前,支持 Qt 版本 4 至 6。

此属性由 CMAKE_AUTOMOC 变量的值初始化,如果该变量在创建目标时已设置。

当此属性设置为 ON 时,CMake 将在构建时扫描头文件和源文件,并相应地调用 moc

头文件处理

在配置时,应由 AUTOMOC 扫描的头文件列表从目标的源文件中计算得出。

  • 目标源文件中的所有头文件都会添加到扫描列表中。

  • 对于目标源文件中的所有 C++ 源文件 <source_base>.<source_extension>,CMake 搜索

    • 具有相同基本名称的常规头文件 (<source_base>.<header_extension>) 和

    • 具有相同基本名称和 _p 后缀的私有头文件 (<source_base>_p.<header_extension>)

    并将它们添加到扫描列表中。

在构建时,CMake 扫描列表中每个未知或已修改的头文件,并搜索

如果找到 Qt 宏,则头文件将由 moc 编译为输出文件 moc_<base_name>.cpp。完整的输出文件路径在 输出文件位置 部分中描述。

如果来自其他文件依赖项的文件发生更改,头文件将再次被 moc 编译。

头文件 moc 输出文件 moc_<base_name>.cpp 可以包含在源文件中。在 在源文件中包含头文件 moc 文件 部分中有关于该主题的更多信息。

源文件处理

在构建时,CMake 扫描目标源文件中的每个未知或已修改的 C++ 源文件,以查找

如果找到 Qt 宏,则 C++ 源文件 <base>.<source_extension> 也应包含一个 include 语句

#include <<base>.moc> // or
#include "<base>.moc"

然后,源文件将由 moc 编译为输出文件 <base>.moc。完整输出文件路径的描述在 输出文件位置 部分。

如果来自其他文件依赖项的文件发生更改,源文件将再次被 moc 编译。

在源文件中包含头文件 moc 文件

源文件可以通过使用以下形式的 include 语句来包含头文件 <header_base>.<header_extension>moc 输出文件

#include <moc_<header_base>.cpp> // or
#include "moc_<header_base>.cpp"

如果头文件的 moc 输出文件被源文件包含,则其生成位置将与未包含时不同。这在 输出文件位置 部分中描述。

输出文件位置

包含的 moc 输出文件

被源文件包含的 moc 输出文件将在以下位置生成

  • <AUTOGEN_BUILD_DIR>/include 用于单配置生成器,或在

  • <AUTOGEN_BUILD_DIR>/include_<CONFIG> 用于 多配置 生成器。

其中 <AUTOGEN_BUILD_DIR> 是目标属性 AUTOGEN_BUILD_DIR 的值。

include 目录会自动添加到目标的 INCLUDE_DIRECTORIES 中。

未包含的 moc 输出文件

未包含在源文件中的 moc 输出文件将在以下位置生成

  • <AUTOGEN_BUILD_DIR>/<SOURCE_DIR_CHECKSUM> 用于单配置生成器,或在

  • <AUTOGEN_BUILD_DIR>/include_<CONFIG>/<SOURCE_DIR_CHECKSUM> 用于 多配置 生成器。

其中 <SOURCE_DIR_CHECKSUM> 是从 moc 输入文件的相对父目录路径计算得出的校验和。此方案允许在不同目录中拥有同名的 moc 输入文件。

所有未包含的 moc 输出文件都将由 CMake 生成的文件自动包含

  • <AUTOGEN_BUILD_DIR>/mocs_compilation.cpp,或

  • <AUTOGEN_BUILD_DIR>/mocs_compilation_$<CONFIG>.cpp,

该文件已添加到目标的源文件中。

Qt 版本检测

启用 AUTOMOC 的目标需要知道他们正在使用的 Qt 主版本和次版本。主版本通常由目标链接到的 Qt[456]Core 库的 INTERFACE_QT_MAJOR_VERSION 属性提供。为了查找次版本,CMake 从以下位置构建可用 Qt 版本的列表

  • Qt6Core_VERSION_MAJORQt6Core_VERSION_MINOR 变量(通常由 find_package(Qt6...) 设置)

  • Qt6Core_VERSION_MAJORQt6Core_VERSION_MINOR 目录属性

  • Qt5Core_VERSION_MAJORQt5Core_VERSION_MINOR 变量(通常由 find_package(Qt5...) 设置)

  • Qt5Core_VERSION_MAJORQt5Core_VERSION_MINOR 目录属性

  • QT_VERSION_MAJORQT_VERSION_MINOR 变量(通常由 find_package(Qt4...) 设置)

  • QT_VERSION_MAJORQT_VERSION_MINOR 目录属性

add_executable()add_library() 调用的上下文中。

假设 INTERFACE_QT_MAJOR_VERSION 是有效数字,则采用列表中具有匹配主版本的第一个条目。如果未找到匹配的主版本,则会生成错误。如果 INTERFACE_QT_MAJOR_VERSION 不是有效数字,则采用列表中的第一个条目。

find_package(Qt[456]...) 调用设置 QT/Qt[56]Core_VERSION_MAJOR/MINOR 变量。如果调用与 add_executable()add_library() 调用不同的上下文,例如在函数中,则版本变量可能对启用 AUTOMOC 的目标不可用。在这种情况下,版本变量可以从 find_package(Qt[456]...) 调用上下文转发到 add_executable()add_library() 调用上下文作为目录属性。以下 Qt5 示例演示了该过程。

function (add_qt5_client)
  find_package(Qt5 REQUIRED QUIET COMPONENTS Core Widgets)
  ...
  set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    PROPERTY Qt5Core_VERSION_MAJOR "${Qt5Core_VERSION_MAJOR}")
  set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
    PROPERTY Qt5Core_VERSION_MINOR "${Qt5Core_VERSION_MAJOR}")
  ...
endfunction ()
...
add_qt5_client()
add_executable(myTarget main.cpp)
target_link_libraries(myTarget Qt5::QtWidgets)
set_property(TARGET myTarget PROPERTY AUTOMOC ON)

修饰符

AUTOMOC_EXECUTABLE: moc 可执行文件将自动检测,但可以使用此目标属性强制设置为特定二进制文件。

AUTOMOC_MOC_OPTIONS: 可以在此目标属性中设置 moc 的其他命令行选项。

AUTOMOC_MACRO_NAMES: 可以扩展此 Qt 宏名称列表,以在头文件和源文件中搜索其他宏。

AUTOMOC_DEPEND_FILTERS: 可以通过在此目标属性中定义文件名过滤器,从头文件或源文件中提取 moc 依赖项文件名。

AUTOMOC_COMPILER_PREDEFINES: moc 的编译器预定义项写入 moc_predefs.h 文件。可以在此目标属性中启用或禁用此文件的生成。

SKIP_AUTOMOC: 可以通过设置此源文件属性,将源文件和头文件从 AUTOMOC 处理中排除。

SKIP_AUTOGEN: 可以通过设置此源文件属性,将源文件从 AUTOMOCAUTOUICAUTORCC 处理中排除。

AUTOGEN_SOURCE_GROUP: 此全局属性可用于在 IDE 中(例如在 MSVS 中)将由 AUTOMOCAUTORCC 生成的文件分组在一起。

AUTOGEN_TARGETS_FOLDER: 此全局属性可用于在 IDE 中(例如在 MSVS 中)将 AUTOMOCAUTOUICAUTORCC 目标分组在一起。

CMAKE_GLOBAL_AUTOGEN_TARGET: 当此变量为 ON 时,将生成一个全局 autogen 目标,该目标依赖于项目中所有 AUTOMOCAUTOUIC 生成的 <ORIGIN>_autogen 目标 目标。

AUTOGEN_PARALLEL: 此目标属性控制构建期间并行启动的 mocuic 进程数。

AUTOGEN_COMMAND_LINE_LENGTH_MAX: 此目标属性控制何时在 Windows 上为 mocuic 进程使用响应文件的限制。

有关将 CMake 与 Qt 一起使用的更多信息,请参阅 cmake-qt(7) 手册。