如何在 Bazel 中禁用 C/C++ `-Werror` 构建错误? (又名:如何关闭已由“-Wall -Werror”打开的特定警告)

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

我在构建时遇到以下错误:

...has undefined behavior [-Werror,-Wundefined-reinterpret-cast]

Bazel 构建完全停止,因为此 clang(llvm 编译器)

-Wundefined-reinterpret-cast
警告
-Werror
转换为构建错误。

尽管出现此构建错误,如何强制构建继续并生成二进制可执行文件?

请注意,我的 bazel 构建命令具有以下形式:

time bazel build //my/src/...
c++ gcc build clang bazel
2个回答
8
投票

答案是使用

-Wno-error=<name>
构建标志,如 gcc 此处所述(请注意,clang 的选项是在 gcc 之后建模的):

-Werror=

将指定的警告变为错误。附加警告说明符;例如

-Werror=switch
将由
-Wswitch
控制的警告转变为错误。 此开关采用否定形式,用于否定特定警告的
-Werror
;例如,即使
-Wno-error=switch
有效,
-Wswitch
也不会导致
-Werror
警告成为错误。

每个可控警告的警告消息包括控制警告的选项。然后,该选项可以与

-Werror=
-Wno-error=
一起使用,如上所述。

来源:https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html(已添加重点)。

因此,对于这种情况,请添加构建选项

-Wno-error=undefined-reinterpret-cast
以关闭
-Werror=undefined-reinterpret-cast
标志。

在 Bazel 中,您可以使用

--copt="<flag>"
选项传递 C/C++ 构建选项(参见 here)(另请参见
--per_file_copt
选项(参见 herehere)),使最终命令看起来像对于这种情况:

time bazel build --copt="-Wno-error=undefined-reinterpret-cast" //my/src/...

这有效! Bazel 构建现已运行完成,仅再次将这些问题显示为警告(请注意,现在警告声明中缺少

-Werror
):

...has undefined behavior [-Wundefined-reinterpret-cast]

请注意,如果您需要一次传递多个构建标志,请使用多次调用

--copt=
。例如:

time bazel build --copt="-Wno-error=undefined-reinterpret-cast" \
--copt="-Wno-error=switch" --copt="-ggdb" --copt="-O0" //my/src/...

注意:不要在生产代码中执行此操作,以应对此类潜在的严重警告(例如:未定义的行为)。对于更良性的警告,如果您确实需要禁用警告,那么这是正确的技术。对于未定义的行为,这应该只是为了学习。请参阅此答案下面的评论:

这会让你继续前进,但是转向有关潜在阴暗的警告

reinterpret_casts
有点让我感到紧张。
– 用户4581301
2020 年 9 月 29 日 0:10

它不适用于生产代码。只是为了使用各种技术收集编译二进制文件的一些

size
输出数据。我同意:禁用这个特定的警告对于生产代码来说是一个坏主意。但是,这个答案是一个通用示例,说明该过程如何寻找更良性的警告,为此目的,这个答案正是我所需要的。
– 加布里埃尔·斯台普斯
2020 年 9 月 29 日 0:13

更多阅读:

  1. 我在我的 eRCaGuy_hello_world 存储库中,在标题为 “其他 C 和 C++ 构建说明(例如:w/
    gcc
    clang
    编译器)”的部分中记录了上述大量信息以及更多信息,此处
    。阅读此处了解更多信息。
  2. [我仍然需要尝试测试一下] https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/ - 请参阅特别是。 “3.3 通过控制诊断堆栈抑制警告”一节。了解仅针对某些文件或代码部分启用/禁用 GCC 和 Clang 编译器警告和选项。考虑将必要的
    #pragma
    语句放在头文件
    #include
    语句的上方和下方,以仅影响这些文件。

0
投票

弃用警告

bazel build --javacopt=-Xlint:-deprecation //...

您可以在

.bazelrc
步骤
之后将此选项添加到您的
build

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