target_precompile_headers
Добавлено в версии 3.16.
Добавляет список файлов заголовков для предварительной компиляции.
Предварительная компиляция файлов заголовков может ускорить компиляцию: для некоторых файлов заголовков создаётся частично обработанная версия, которая затем используется при компиляции вместо повторного разбора исходных заголовков.
Основная форма
target_precompile_headers(<target>
{INTERFACE|PUBLIC|PRIVATE} <header>...
[{INTERFACE|PUBLIC|PRIVATE} <header>...]...)
Команда добавляет файлы заголовков в свойства цели PRECOMPILE_HEADERS и/или INTERFACE_PRECOMPILE_HEADERS для <target>. Указанная <target> должна быть создана такой командой, как add_executable() или add_library(), и не должна быть целью ALIAS.
Ключевые слова INTERFACE, PUBLIC и PRIVATE обязательны для указания области действия следующих аргументов. Элементы PRIVATE и PUBLIC заполняют свойство PRECOMPILE_HEADERS для <target>. Элементы PUBLIC и INTERFACE заполняют свойство INTERFACE_PRECOMPILE_HEADERS для <target> (для импортированных целей поддерживаются только элементы INTERFACE). При повторных вызовах для одной и той же <target> элементы добавляются в порядке вызова.
Как правило, проектам следует избегать использования PUBLIC или INTERFACE для целей, которые будут exported, либо, как минимум, использовать генераторное выражение $<BUILD_INTERFACE:...>, чтобы предварительно скомпилированные заголовки не попадали в экспортируемую установленную цель. Обычно потребители цели должны сами определять, какие предварительно скомпилированные заголовки использовать, а не получать их принудительно от используемых целей (поскольку предварительно скомпилированные заголовки обычно не являются требованиями использования). Важным исключением является создание интерфейсной библиотеки для определения в одном месте общего набора предварительно скомпилированных заголовков, к которой другие цели затем подключаются приватно. В этом случае интерфейсная библиотека предназначена именно для передачи предварительно скомпилированных заголовков своим потребителям, и потребитель фактически по-прежнему контролирует этот процесс, поскольку сам решает, подключать ли интерфейсную библиотеку.
Список файлов заголовков используется для создания файла заголовка с именем cmake_pch.h|xx, который служит для создания артефакта предварительно скомпилированного заголовка (.pch, .gch, .pchi). Файл заголовка cmake_pch.h|xx принудительно подключается (-include для GCC, /FI для MSVC) ко всем исходным файлам, поэтому в исходниках не требуется указывать #include "pch.h".
Имена файлов заголовков, указанные в угловых скобках (например, <unordered_map>) или в явных двойных кавычках (экранированных для cmake-language(7), например, [["other_header.h"]]), используются без изменений, и каталоги включаемых файлов должны быть доступны компилятору для их поиска. Другие имена файлов заголовков (например, project_header.h) считаются относительными к текущему каталогу исходных файлов (например, CMAKE_CURRENT_SOURCE_DIR) и подключаются по абсолютному пути. Например:
target_precompile_headers(myTarget
PUBLIC
project_header.h
PRIVATE
[["other_header.h"]]
<unordered_map>
)
Аргументы команды target_precompile_headers могут использовать генераторные выражения в синтаксисе $<...>. Доступные выражения приведены в руководстве cmake-generator-expressions(7). Генераторное выражение $<COMPILE_LANGUAGE:...> особенно полезно для указания языково-зависимого заголовка, который следует предварительно скомпилировать только для одного языка (например, CXX, но не C). В этом случае имена файлов заголовков, не заключённые явно в двойные кавычки или угловые скобки, необходимо указывать абсолютным путём. Кроме того, при использовании угловых скобок внутри генераторного выражения обязательно кодируйте закрывающую > как $<ANGLE-R>. Например:
target_precompile_headers(mylib PRIVATE
"$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/cxx_only.h>"
"$<$<COMPILE_LANGUAGE:C>:<stddef.h$<ANGLE-R>>"
"$<$<COMPILE_LANGUAGE:CXX>:<cstddef$<ANGLE-R>>"
)
Повторное использование предварительно скомпилированных заголовков
Команда также поддерживает вторую сигнатуру, позволяющую указать, что одна цель использует артефакт предварительно скомпилированного заголовка другой цели вместо создания собственного:
target_precompile_headers(<target> REUSE_FROM <other_target>)
Эта форма устанавливает для свойства PRECOMPILE_HEADERS_REUSE_FROM значение <other_target> и добавляет зависимость, согласно которой <target> будет зависеть от <other_target>. CMake завершит работу с ошибкой, если свойство PRECOMPILE_HEADERS для <target> уже установлено при использовании формы REUSE_FROM.
Примечание
Форма REUSE_FROM требует одинакового набора параметров, флагов и определений компилятора для обеих целей: <target> и <other_target>. Некоторые компиляторы (например, GCC) могут выдать предупреждение, если файл предварительно скомпилированного заголовка нельзя использовать (-Winvalid-pch).
См. также
- Чтобы отключить предварительно скомпилированные заголовки для отдельных целей, см. свойство цели
DISABLE_PRECOMPILE_HEADERS. - Чтобы запретить использование предварительно скомпилированных заголовков при компиляции определённого исходного файла, см. свойство исходного файла
SKIP_PRECOMPILE_HEADERS. target_compile_definitions()target_compile_features()target_compile_options()target_include_directories()target_link_libraries()target_link_directories()target_link_options()target_sources()
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/command/target_precompile_headers.html