Влияние установки CMAKE_CXX_FLAG в проекте C ++ - PullRequest
0 голосов
/ 07 октября 2018

У меня есть проект C ++, и я хочу использовать CMake в проекте.В моем проекте несколько каталогов и подкаталогов.

У меня есть верхний уровень CMakeLists.txt, который создает весь проект.У меня также есть CMakeLists.txt в подкаталогах.Я хотел установить флаги компилятора, но вот что меня смущает.Применяются ли эффекты флагов компилятора в CMake только к соответствующему каталогу или будут применяться ко всему проекту?

Например, с моим проектом (назовем его MyProject) ассоциировано CMakeLists.txt.Проект имеет две подкаталоги A и B.Каждый со своим CMakeLists.txtA/CMakelist.txt я установил флаг компилятора, как показано ниже:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y -Wno-narrowing")

B/CMakeLists.txt выглядит следующим образом:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y")

Что я не понимаю, так это то, чтокомпилятор также будет использовать флаг -Wno-narrowing для файлов cpp в подкаталоге B (в общем, будет ли он применяться ко всему проекту)?

Является ли область установки флага компилятора (вообще любой переменной)в CMakeList.txt применимы только к соответствующему каталогу или будут применяться глобально на протяжении всего проекта?

1 Ответ

0 голосов
/ 07 октября 2018

Команда CMake set работает с областью функций и каталогов.То есть, если вы установите переменную, как вы, вне функции CMake, эффект будет виден в этом каталоге и во всех его подкаталогах.

Всякий раз, когда вы определяете новую цель (посредством вызова add_executableили add_library), значение переменной CMAKE_CXX_FLAG в этой точке будет использоваться для определения начального значения целевых свойств для флагов компиляции.

Таким образом, -Wno-narrowing опция не должна иметь возможность перетекать из одного подкаталога в подкаталог одноуровневого каталога.

Краткое примечание о современном стиле CMake: предпочтительнее использовать функциональные возможности компиляции , чем устанавливать параметр -stdнепосредственно.Первый будет переносимым и будет работать со всеми наборами инструментов и версиями компилятора.Например, чтобы требовать C ++ 14 глобально для всех целей в проекте, просто set(CMAKE_CXX_STANDARD 14) в списках CMake верхнего уровня.Аналогично, рассмотрите возможность использования команды target_compile_options для настройки параметров, которые применяются только к определенным целям вашего проекта.Использование этой команды обычно менее подвержено ошибкам, чем повсеместное использование глобальной переменной.Для ручных специфичных для цепочки инструментов флагов, таких как -Wno-narrowing, рассмотрите возможность их оборачивания в выражение генератора , чтобы убедиться, что они будут использоваться только в цепях инструментов, поддерживающих флаг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...