Каков современный метод установки общих флагов компиляции в CMake?
Существует несколько механизмов, предлагаемых CMake для получения флагов компилятору:
есть ли один метод, который предпочтительнее другого в современном использовании? Если да, то почему? Кроме того, как этот метод может использоваться с несколькими системами конфигурации, такими как MSVC?
1 ответ:
для современного CMake (версии 2.8.12 и выше) вы должны использовать
target_compile_options
, который использует целевые свойства внутренне.
CMAKE_<LANG>_FLAGS
является глобальной переменной и наиболее подвержена ошибкам в использовании. Он также не поддерживает выражений генератор, что может очень пригодиться.
add_compile_options
основан на свойствах каталога, что прекрасно в некоторых ситуациях, но обычно не самый естественный способ указать параметры.
target_compile_options
работает на целевой основе (через установкуCOMPILE_OPTIONS
иINTERFACE_COMPILE_OPTIONS
target properties), что обычно приводит к самому чистому коду CMake, поскольку параметры компиляции для исходного файла определяются тем, к какому проекту принадлежит файл (а не к какому каталогу он помещен на жесткий диск). Это имеет дополнительное преимущество, что она автоматически заботится о передаче параметров на к зависимым целям, если запрошенный.несмотря на то, что они немного более подробны, команды для каждой цели позволяют достаточно мелкозернистый контроль над различными вариантами сборки и (по моему личному опыту) наименее вероятно, чтобы вызвать головные боли в долгосрочной перспективе.
в теории, вы также можете установить соответствующие свойства непосредственно с помощью
set_target_properties
, аtarget_compile_options
обычно более читабельно.например, чтобы установить параметры компиляции целевого объекта
foo
на основе конфигурация с помощью генераторных выражений вы можете написать:target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>") target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")