如何在CMake中设置警告级别?

时间:2010-03-03 04:37:37

标签: cmake warning-level

如何使用 CMake 项目(而不是整个解决方案)设置警告级别?应该适用于 Visual Studio GCC

我发现了各种选项,但大多数似乎要么不起作用,要么与文档不一致。

6 个答案:

答案 0 :(得分:82)

更新:这个答案早于Modern CMake时代。每个理智的CMake用户都应该避免直接摆弄CMAKE_CXX_FLAGS并改为调用target_compile_options命令。查看提供推荐最佳做法的mrts' answer

你可以做类似的事情:

if(MSVC)
  # Force to always compile with W4
  if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
    string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
  endif()
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
  # Update if necessary
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")
endif()

答案 1 :(得分:33)

在现代CMake中,以下效果很好:

if(MSVC)
  target_compile_options(${TARGET_NAME} PRIVATE /W4 /WX)
else()
  target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
endif()

${TARGET_NAME}替换为实际目标名称。 -Werror是可选的,它会将所有警告变为错误。

答案 2 :(得分:23)

有些CMake modules I've written包含实验cross-platfrom warning suppression

sugar_generate_warning_flags(
    target_compile_options
    target_properties
    ENABLE conversion
    TREAT_AS_ERRORS ALL
)

set_target_properties(
    foo
    PROPERTIES
    ${target_properties}
    COMPILE_OPTIONS
    "${target_compile_options}"
)

Xcode的结果:

  • 设置CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION Xcode属性 (又名构建设置 - > 警告 - > 可疑隐式转化 - >
  • 添加编译器标志:-Werror

Makefile gcc和clang:

  • 添加编译器标记:-Wconversion-Werror

Visual studio:

  • 添加编译器标记:/WX/w14244

链接

答案 3 :(得分:7)

这是我到目前为止找到的最佳解决方案(包括编译器检查):

if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)")
    add_definitions(/W2)
endif()

这将在Visual Studio中设置警告级别2。我想用-W2它也可以在GCC中工作(未经测试)。

来自@Williams的更新:GCC应为-Wall

答案 4 :(得分:4)

根据Cmake 3.18.4 documentation

if (MSVC)
    # warning level 4 and all warnings as errors
    add_compile_options(/W4 /WX)
else()
    # lots of warnings and all warnings as errors
    add_compile_options(-Wall -Wextra -pedantic -Werror)
endif()

GCC和Clang共享这些标志,因此这应该涵盖所有3个。

答案 5 :(得分:2)

if(MSVC)
    string(REGEX REPLACE "/W[1-3]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()

如果使用target_compile_options-cmake将尝试使用双/W*标志,这将由编译器发出警告。