2016-09-15 10 views
7

Этот вопрос относится к Instruct Cmake to use CXX and CXXFLAGS when driving link? В первом вопросе мы пытаемся указать CMake использовать CXXFLAGS при вызове компоновщика.Разница между add_compile_options и SET (CMAKE_CXX_FLAGS ...)

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 в обоих случаях. So -foo определенно пробивается в CXXFLAGS.

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

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

+0

В случае версий имеет значение: 'cmake --version' возвращает' cmake version 3.6.2'. – jww

+0

Это, по крайней мере, ваш пятый вопрос относительно CMake в течение последних нескольких дней. Не возражаете ли вы признать, что это называется CMake, а не Cmake? – usr1234567

+0

@ usr1234567 - Да, извините за вопросы. Люди, которые хотели CMake, не поддерживают его, поэтому теперь ответственность за меня падает. Я почти ничего не знаю о CMake, потому что я использую GNUmake и пишу свои собственные make-файлы. Я * жалею о том, что принимаю те пласты CMake ... И да, я получу вопросы, отредактированные. Извини за это. – jww

ответ

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

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

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

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

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

+0

Спасибо @ usr1234567. На сайте вызова, когда 'CMAKE_CXX_FLAGS' был напечатан с сообщением (STAUS, ...)', почему CMake не дал значения, добавленные с параметрами 'target_compile_definitions' и' add_definitions'? Почему они не были напечатаны? – jww

+1

@jww: Поскольку 'CMAKE_CXX_FLAGS' не накапливает значения, добавленные с помощью' target_compile_definitions' и 'add_definitions'. Это * generator *, который формирует вызов компилятора и собирает все его параметры: из переменных 'CMAKE_CXX_FLAGS',' CMAKE_CXX_FLAGS_ ', из свойства объекта' COMPILE_DEFINITION' и т. Д. – Tsyvarev

+0

@jww: Я добавил пункт, касающийся вашего вопроса. – usr1234567