代码之家  ›  专栏  ›  技术社区  ›  Wernight

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

  •  85
  • Wernight  · 技术社区  · 15 年前

    如何设置 警告级别 对于一个 项目 (不是全部解决方案)使用 小精灵 ?应该努力 Visual Studio 海湾合作委员会 .

    我找到了各种各样的选择,但大多数似乎要么不起作用,要么与文档不一致。

    4 回复  |  直到 6 年前
        1
  •  81
  •   mloskot    6 年前

    更新:这个答案早于现代的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()
    
        2
  •  21
  •   xaxxon    7 年前

    一些 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属性 (阿卡 生成设置 -gt; 警告 -gt; 可疑的隐式转换 -gt; )
    • 添加编译器标志: -Werror

    生成文件gcc和clang:

    • 添加编译器标志: -Wconversion , -错误

    Visual Studio:

    • 添加编译器标志: /WX , /w14244

    链接

        3
  •  20
  •   mrts    6 年前

    在现代CMAKE中,以下功能很好:

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

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

        4
  •  8
  •   Wernight    10 年前

    以下是迄今为止我找到的最佳解决方案(包括编译器检查):

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

    这将在visual studio中设置警告级别2。我想是因为 -W2 它也可以在gcc中工作(未经测试)。

    @williams更新:应该是 -Wall 对于海湾合作委员会。