Разница между add_compile_options и SET (CMAKE_CXX_FLAGS...)

Этот вопрос связан с Поручить Cmake использовать CXX и CXXFLAGS во время вождения ссылки? В первом вопросе мы пытаемся указать CMake использовать CXXFLAGS, когда он вызывает компоновщик.

add_compile_options

Мы обнаружили, что следующий код

if (CMAKE_VERSION VERSION_LESS 2.8.12)
    add_definitions(-foo)
else()
    add_compile_options(-foo)
endif()

message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}")

выводит вывод

CXXFLAGS:

SET CMAKE_CXX_FLAGS

Мы обнаружили, что следующий код

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -foo" )

message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}")

выводит вывод

CXXFLAGS: -foo

Вопросы

Мы обнаружили, что CMake создаст объектные файлы, используя -foo в обоих случаях. Итак, -foo определенно пробивается в CXXFLAGS.

В чем разница между первым набором кода CMake и вторым набором кода CMake?

Почему CMAKE_CXX_FLAGS отменяется в одном экземпляре и устанавливается в другом экземпляре?

Ответ 1

  • CMAKE_CXX_FLAGS используется для добавления флагов для всех целей С++. Это удобно передавать общие аргументы, такие как уровни предупреждений или выбранные стандарты С++. Он не влияет на цели C или Fortran, и пользователь может передать дополнительные флаги.

  • add_compile_options добавляет параметры ко всем целям в каталоге и его подкаталогах. Это удобно, если у вас есть библиотека в каталоге, и вы хотите добавить параметры ко всем объектам, связанным с библиотекой, но не связанным со всеми другими объектами. Кроме того, add_compile_options может обрабатывать аргументы с выражением генератора . В документации явно указано, что

Эта команда может использоваться для добавления любых параметров, но альтернативные команды существуют для добавления определений препроцессора (target_compile_definitions()и add_definitions()) или включить каталоги (target_include_directories() и include_directories()).

  • add_definitions предназначен для передачи значений препроцессора типа -DFOO -DBAR=32 (/D в Windows), который определяет и устанавливает препроцессорные переменные. Вы можете передать любой флаг, но флаги вышеуказанной формы будут обнаружены и добавлены в свойство [COMPILE_DEFINITIONS][2], которое вы можете впоследствии прочитать и изменить. Здесь вы также можете использовать выражения генератора. В документации указаны области действия для каталогов, целей и исходных файлов.

Для данной цели CMake будет собирать все флаги из CMAKE_CXX_FLAGS, цели и каталога COMPILE_DEFINITIONS и всех add_compile_options, которые влияют на цель.
CMAKE_CXX_FLAGS не изменяются другими командами или наоборот. Это нарушит объем этих команд.