Spec-Zone.ru › CMake

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API