CMake предлагает несколько механизмов для передачи флагов компилятору:
Есть ли один метод, который предпочтительнее другого в современном использовании? Если да, то почему? Кроме того, как этот метод можно использовать с несколькими системами конфигурации, такими как MSVC?
Ответы:
Для современного CMake (версии 2.8.12 и выше) вы должны использовать
target_compile_options
, который внутренне использует целевые свойства.CMAKE_<LANG>_FLAGS
- это глобальная переменная, которая наиболее подвержена ошибкам в использовании. Он также не поддерживает выражения генератора , что может очень пригодиться.add_compile_options
основан на свойствах каталога, что в некоторых случаях нормально, но обычно не самый естественный способ указания параметров.target_compile_options
работает для каждой цели (путем установки свойствCOMPILE_OPTIONS
иINTERFACE_COMPILE_OPTIONS
target), что обычно приводит к наиболее чистому коду CMake, поскольку параметры компиляции для исходного файла определяются тем, к какому проекту принадлежит файл (а не в какой каталог он помещен. на жестком диске). Это имеет дополнительное преимущество, заключающееся в том, что он автоматически заботится о передаче опций зависимым целям, если они запрошены.Несмотря на то, что они немного более подробны, команды для каждой цели позволяют достаточно детально контролировать различные параметры сборки и (по моему личному опыту) с наименьшей вероятностью вызовут головную боль в долгосрочной перспективе.
Теоретически вы также можете установить соответствующие свойства напрямую
set_target_properties
, ноtarget_compile_options
обычно это более читабельно.Например, чтобы установить параметры компиляции цели
foo
на основе конфигурации с использованием выражений генератора, вы можете написать:В
PUBLIC
,PRIVATE
иINTERFACE
ключевые слова определяют сферу вариантов . Например, если мы ссылаемсяfoo
наbar
сtarget_link_libraries(bar foo)
:PRIVATE
параметры будут применяться только к самой цели (foo
), а не к другим библиотекам (потребителям), связывающимся с ней.INTERFACE
параметры будут применяться только к целевой целиbar
PUBLIC
параметры будут применены как к исходной цели, такfoo
и к целевой целиbar
источник
target_compile_options
добавьте параметры, чтобы вы могли изменить последнюю строку таким образом, чтобы сделать ее более читаемой)COMPILE_OPTIONS
делает свойство каталога. Вы можете использоватьadd_compile_options
команду, чтобы установить это. Вариантов, для которых это хороший подход, обычно немного.PUBLIC
вtarget_compile_options
?PUBLIC
к ответу дополнительное объяснение ключевого слова.Эти три способа служат для разных целей, поэтому ни один из них не предпочтительнее других. Это
CMAKE_<LANG>_FLAGS
переменная, которую пользователь может определить для передачи флагов при вызове CMake для проекта. Два других используются в проекте. Один для установки флагов для конкретной цели, другой для всего каталога или выражения генератора.Связанный вопрос: разница между add_compile_options и SET (CMAKE_CXX_FLAGS ...)
источник
target_compile_options
путь. ИМХОtarget_compile_options
следует предпочесть, поскольку он позволяет детально контролировать параметры и позволяет использовать выражения генератора.add_compile_options
устанавливает флаги для всего каталога. Не могли бы вы подробнее рассказать об этом факте? Также есть различные сайты, где упоминается, чтоtarget_compile_options
следует предпочесть.