target_precompile_headers
Добавлен в версии 3.16.
Добавьте список файлов заголовков для предварительной компиляции.
Предварительная компиляция файлов заголовков может ускорить компиляцию, создавая частично обработанную версию некоторых файлов заголовков и затем используя эту версию во время компиляции вместо повторного анализа исходных заголовков.
Основная форма
target_precompile_headers(<target> <INTERFACE|PUBLIC|PRIVATE> [header1...] [<INTERFACE|PUBLIC|PRIVATE> [header2...] ...])
Команда добавляет файлы заголовков в свойства цели 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>). Повторные вызовы для одной и той же <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–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/command/target_precompile_headers.html