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 сканирует каждый неизвестный или изменённый файл заголовка из списка и ищет
- макрос Qt из
AUTOMOC_MACRO_NAMES, - дополнительные файловые зависимости, заданные аргументом
FILEмакросаQ_PLUGIN_METADATA, и - дополнительные файловые зависимости, обнаруженные фильтрами, определёнными в
AUTOMOC_DEPEND_FILTERS.
Если найден макрос Qt, файл заголовка будет обработан с помощью moc, а результат будет записан в файл moc_<base_name>.cpp. Полный путь к выходному файлу описан в разделе Расположение выходных файлов.
Файл заголовка будет повторно скомпилирован moc, если изменится файл из списка дополнительных файловых зависимостей.
Выходные файлы moc заголовков moc_<base_name>.cpp можно включать в исходные файлы. Дополнительные сведения приведены в разделе Включение файлов moc заголовков в исходные файлы.
Обработка исходных файлов
Во время сборки CMake сканирует каждый неизвестный или изменённый исходный файл C++ из исходных файлов цели в поисках
- макроса Qt из
AUTOMOC_MACRO_NAMES, - включений файлов
mocзаголовков (см. раздел Включение файлов moc заголовков в исходные файлы), - дополнительных файловых зависимостей, заданных аргументом
FILEмакросаQ_PLUGIN_METADATA, и - дополнительных файловых зависимостей, обнаруженных фильтрами, определёнными в
AUTOMOC_DEPEND_FILTERS.
Если найден макрос Qt, ожидается, что исходный файл C++ <base>.<source_extension> также содержит директиву включения
#include <<base>.moc> // or #include "<base>.moc"
Затем исходный файл будет обработан с помощью moc, а результат будет записан в файл <base>.moc. Описание полного пути к выходному файлу приведено в разделе Расположение выходных файлов.
Исходный файл будет повторно скомпилирован moc, если изменится файл из списка дополнительных файловых зависимостей.
Включение файлов moc заголовков в исходные файлы
Исходный файл может включать выходной файл moc файла <header_base>.<header_extension> заголовка с помощью директивы включения следующего вида
#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, с которыми они работают. Основная версия обычно задаётся свойством INTERFACE_QT_MAJOR_VERSION библиотеки Qt[456]Core, с которой связана цель. Чтобы определить дополнительную версию, 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: Это свойство цели задаёт порог, при превышении которого для процессов moc или uic в Windows используются файлы отклика.
Дополнительные сведения об использовании CMake с Qt см. в руководстве cmake-qt(7).
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/prop_tgt/AUTOMOC.html