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>)
并将这些文件添加到扫描列表中。
可以通过设置
AUTOMOC_INCLUDE_DIRECTORIES目标属性来显式告知moc需要搜索哪些包含目录。如果未设置,则默认使用来自目标及其依赖项传递闭包的包含目录。
在构建时,CMake 会扫描列表中每个未知或已修改的头文件,并搜索
AUTOMOC_MACRO_NAMES中的 Qt 宏,Q_PLUGIN_METADATA宏的FILE参数中的附加文件依赖项,以及AUTOMOC_DEPEND_FILTERS中定义的过滤器检测到的附加文件依赖项。
如果找到 Qt 宏,则头文件将由 moc 编译为输出文件 moc_<base_name>.cpp。完整的输出文件路径在 输出文件位置 部分进行了描述。
如果附加文件依赖项中的文件发生更改,头文件将重新使用 moc 进行编译。
头文件 moc 输出文件 moc_<base_name>.cpp 可以包含在源文件中。在 在源文件中包含头文件 moc 文件 部分有更多关于此主题的信息。
源文件处理¶
在构建时,CMake 会扫描目标源文件中每个未知或已修改的 C++ 源文件,查找
AUTOMOC_MACRO_NAMES中的 Qt 宏,对头文件
moc文件的包含 (请参阅 在源文件中包含头文件 moc 文件),Q_PLUGIN_METADATA宏的FILE参数中的附加文件依赖项,以及AUTOMOC_DEPEND_FILTERS中定义的过滤器检测到的附加文件依赖项。
如果找到 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_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_MAJOR和Qt6Core_VERSION_MINOR变量 (通常由find_package(Qt6...)设置)Qt6Core_VERSION_MAJOR和Qt6Core_VERSION_MINOR目录属性Qt5Core_VERSION_MAJOR和Qt5Core_VERSION_MINOR变量 (通常由find_package(Qt5...)设置)Qt5Core_VERSION_MAJOR和Qt5Core_VERSION_MINOR目录属性QT_VERSION_MAJOR和QT_VERSION_MINOR变量 (通常由find_package(Qt4...)设置)QT_VERSION_MAJOR和QT_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 文件。此文件的生成可以在此目标属性中启用或禁用。
AUTOMOC_INCLUDE_DIRECTORIES: 指定一个或多个包含目录,供 AUTOMOC 显式传递给 moc,而不是自动发现目标的包含目录。
SKIP_AUTOMOC: 可以通过设置此源文件属性将源文件和头文件排除在 AUTOMOC 处理之外。
SKIP_AUTOGEN: 可以通过设置此源文件属性将源文件排除在 AUTOMOC、AUTOUIC 和 AUTORCC 处理之外。
AUTOGEN_SOURCE_GROUP: 可以使用此全局属性将 AUTOMOC 或 AUTORCC 生成的文件在 IDE 中分组,例如在 MSVS 中。
AUTOGEN_TARGETS_FOLDER: 可以使用此全局属性将 AUTOMOC、AUTOUIC 和 AUTORCC 目标在 IDE 中分组,例如在 MSVS 中。
CMAKE_GLOBAL_AUTOGEN_TARGET: 当此变量设置为 ON 时,将生成一个全局 autogen 目标,该目标依赖于项目中所有 AUTOMOC 或 AUTOUIC 生成的 <ORIGIN>_autogen 目标。
AUTOGEN_PARALLEL: 此目标属性控制构建期间并行启动的 moc 或 uic 进程的数量。
AUTOGEN_COMMAND_LINE_LENGTH_MAX: 此目标属性控制在 Windows 上使用 moc 或 uic 进程的响应文件时的限制。
有关将 CMake 与 Qt 结合使用的更多信息,请参阅 cmake-qt(7) 手册。