Как установить уровень предупреждения для проекта (а не всего решения) с помощью CMake ? Должен работать в Visual Studio и GCC .
Я нашел различные варианты, но большинство из них либо не работают, либо не соответствуют документации.
cmake
warning-level
Wernight
источник
источник
/Wall
флаг (с именемEnableAllWarnings
). Он выдает даже больше предупреждений, чем/W4
. Однако, по моему опыту, он дает слишком много предупреждений./Wall
можно использовать, если вы хотите использовать «вычитающую» стратегию предупреждений, как и clang-Weverything
. Вместо того, чтобы выбирать предупреждения для включения, вы включаете все, а затем выбираете определенные предупреждения, которые нужно отключить.В современном CMake хорошо работает следующее:
Мой коллега предложил альтернативный вариант:
Замените
${TARGET_NAME}
фактическим именем цели.-Werror
не является обязательным, он превращает все предупреждения в ошибки.Или используйте
add_compile_options(...)
если хотите применить его ко всем целям, как предлагает @aldo в комментариях.Кроме того, убедитесь, что понимаете разницу между
PRIVATE
иPUBLIC
(общедоступные параметры будут унаследованы целями, которые зависят от данной цели).источник
add_compile_options(...)
если вы хотите применить его ко всем целям.else()
илиendif()
.add_compile_options()
в том, что предупреждения будут распространяться на цели, добавленные черезadd_subdirectory()
. Если вы включите внешние библиотеки таким образом, вы можете получить множество предупреждений, если эта библиотека была разработана с другим уровнем предупреждений.Некоторые модули CMake, которые я написал, включают экспериментальное подавление предупреждений между платформами :
Результат для Xcode:
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION
атрибут Xcode (он же настройки сборки -> предупреждения -> подозрительные неявные преобразования -> ДА )-Werror
Makefile gcc и clang:
-Wconversion
,-Werror
Визуальная студия:
/WX
,/w14244
связи
источник
Вот лучшее решение, которое я нашел до сих пор (включая проверку компилятора):
Это установит уровень предупреждения 2 в Visual Studio. Я полагаю, что с a
-W2
это будет работать и в GCC (непроверено).Обновление от @Williams: должно быть
-Wall
для GCC.источник
-Wall
и, возможно,-Wextra
подробно описан на gcc.gnu.org/onlinedocs/gcc/Warning-Options.html-W -Wall -Wextra -pedantic
.-Wextra
IIRC заменен-W
в более поздней версии GCC, но я оставлю оба варианта для обеспечения совместимости.В соответствии с CMake 3.17.1 документации :
GCC и Clang используют эти флаги, поэтому они должны охватывать все 3.
источник
add_compile_options
распространяется на весь каталог, тогдаtarget_compile_options
как только для одной цели.Если вы используете
target_compile_options
- cmake попытается использовать двойной/W*
флаг, который выдаст предупреждение компилятору.источник
add_compile_options
единственный, чтобы получить массу предупреждений,/W3
которые меняют/W4
. Тот факт, что CMake не обращается к этому элементарному параметру (установка уровня предупреждения), невероятен.