将编译器警告视为错误

问题描述 投票:0回答:2

如何配置 CMake 以在构建过程中将编译器警告视为错误?

我知道可以通过像

-Werror
这样的命令为像
target_compile_options
这样的编译器手动配置命令行选项,但我更喜欢一种不需要摆弄依赖于工具的选项的便携式解决方案。

c++ cmake compiler-warnings
2个回答
15
投票

这可以在 CMake 版本 3.24 及更高版本中通过

COMPILE_WARNING_AS_ERROR
目标属性进行配置。

例如,要为

my_app
目标启用警告作为错误,您可以编写:

set_property(TARGET my_app PROPERTY COMPILE_WARNING_AS_ERROR ON)

您还可以通过

CMAKE_COMPILE_WARNING_AS_ERROR
变量为项目中的所有目标设置全局默认值:

set(CMAKE_COMPILE_WARNING_AS_ERROR ON)

add_executable(my_app1 [...])
add_executable(my_app2 [...])
add_executable(my_app3 [...])

如果用户觉得 CMakeLists.txt 文件中的设置很烦人,他们仍然可以使用

--compile-no-warning-as-error
配置选项覆盖它。


1
投票

对于具有固定且可预测工具链的 CI 系统来说,将警告视为错误是一种很好的做法,但强制所有用户是“不合适”的。许多人可能使用不同的工具链,其中包含不同的警告集和这些警告的敏感性。默认情况下启用 -Werror 会导致消费者的构建损坏,这是一种不好的做法。

值得注意的是,这个问题是去年 Linux 内核重大崩溃的根源:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit /?id=b339ec9c229aaf399296a120d7be0e34fbc355ca

Gentoo 打包档案也禁止这样做(很重要,因为它是基于源代码的发行版):

https://devmanual.gentoo.org/ebuild-writing/common-mistakes/index.html

再多搜索一下,你就会听到山顶上的呼喊声:

将警告视为错误对开发者有利,但对消费者不利

执行此操作的最佳方法是将新的(从 CMake 3.24 开始)变量

CMAKE_COMPILE_WARNING_AS_ERROR

设置为

ON
,当您知道这样做是安全的时。也就是说,它不应该默认开启(但如果你坚持,那么必须有一种方法可以禁用它)。 设置此功能有很多好方法:

您可以将其添加到
    预设
  1. cacheVariables 部分 您可以在
  2. 工具链文件中
  3. set
    将其
    ON
    
    当您想要打开或关闭它时,只需在命令行中传递它即可。
  4. 对于经常使用树顶编译器构建的人来说,警告经常被破坏,硬编码的警告作为错误是一个祸害。它迫使我和无数其他包维护者、devops 团队等来修补您的构建。

© www.soinside.com 2019 - 2024. All rights reserved.