AUTOMOC

是否应通过自动 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_extention>) 和

    • 具有相同基名称且带有 _p 后缀的私有头文件 (<source_base>_p.<header_extention>)

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

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

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

如果其他文件依赖项中的文件发生更改,则将再次对该头文件进行 moc 编译。

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

源文件处理

在编译时,CMake 将扫描目标源中的每个未知或已修改的 C++ 源文件,以寻找

如果找到 Qt 宏,则 C++ 源文件 <base>.<source_extension> 预计也会包含一条包含语句

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

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

如果附加文件依赖关系中的文件发生更改,则会再次对源 moc 进行编译。

在源中包含头文件 moc 文件

源文件可以通过使用如下形式的包含语句来包含头文件 <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>(对于 multi configuration 生成器)。

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

包含目录会自动添加到目标的 INCLUDE_DIRECTORIES

未包含 moc 输出文件

未包含在源文件中的 moc 输出文件将生成在

  • <AUTOGEN_BUILD_DIR>/<SOURCE_DIR_CHECKSUM>(对于单一配置文件生成器)或

  • <AUTOGEN_BUILD_DIR>/include_<CONFIG>/<SOURCE_DIR_CHECKSUM>(对于 multi configuration 生成器)。

其中 <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 根据以下变量(通常由 find_package(Qt6...) 设置)生成可用 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 不是有效的数字,则会选择列表中的第一项。

A 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_PREDEFINESmoc 的编译器预定义项将写入 moc_predefs.h 文件。在此目标属性中可以启用或禁用此文件的生成。

SKIP_AUTOMOC:可以通过设置此源文件属性将源文件和头文件排除在 AUTOMOC 处理之外。

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

AUTOGEN_SOURCE_GROUP:此全局属性可用于将 AUTOMOCAUTORCC 生成的文件分组放在 IDE 中,例如放在 MSVS 中。

AUTOGEN_TARGETS_FOLDER:此全局属性可用于将 AUTOMOCAUTOUICAUTORCC 目标分组放在 IDE 中,例如放在 MSVS 中。

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

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

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

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