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
: 此全局属性可用于在 IDE(例如 MSVS)中将由 AUTOMOC
或 AUTORCC
生成的文件分组。
AUTOGEN_TARGETS_FOLDER
: 此全局属性可用于在 IDE(例如 MSVS)中将 AUTOMOC
、AUTOUIC
和 AUTORCC
目标分组。
CMAKE_GLOBAL_AUTOGEN_TARGET
: 当此变量为 ON
时,将生成一个全局 autogen
目标,该目标依赖于项目中所有由 AUTOMOC
或 AUTOUIC
生成的 The <ORIGIN>_autogen target 目标。
AUTOGEN_PARALLEL
: 此目标属性控制在构建期间并行启动的 moc
或 uic
进程的数量。
AUTOGEN_COMMAND_LINE_LENGTH_MAX
: 此目标属性控制在 Windows 上何时使用响应文件进行 moc
或 uic
进程的命令行长度限制。
有关将 CMake 与 Qt 一起使用的更多信息,请参阅 cmake-qt(7)
手册。