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

Gab*_*les 3 c++ gcc build clang bazel

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

...has undefined behavior [-Werror,-Wundefined-reinterpret-cast]
Run Code Online (Sandbox Code Playgroud)

Bazel 构建完全停止,因为这个clang(llvm 编译器)-Wundefined-reinterpret-cast警告被 转换为构建错误-Werror

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

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

time bazel build //my/src/...
Run Code Online (Sandbox Code Playgroud)

Gab*_*les 8

答案是使用-Wno-error=<name>构建标志,如 gcc 此处所述(请注意,clang 的选项是根据 gcc 建模的):

\n
\n

-Werror=

\n

将指定的警告变为错误。附加警告说明符;例如-Werror=switch将由 控制的警告变成-Wswitch错误。该开关采用否定形式,用于否定-Werror特定警告;例如,即使-Wno-error=switch警告有效-Wswitch,也不会成为错误。-Werror

\n

每个可控警告的警告消息包括控制警告的选项。-Werror=然后,该选项可以与和 一起使用,-Wno-error=如上所述。

\n
\n

资料来源: https: //gcc.gnu.org/onlinedocs/gcc/Warning-Options.html(强调已添加)。

\n

因此,对于这种情况,请添加构建选项-Wno-error=undefined-reinterpret-cast以关闭该-Werror=undefined-reinterpret-cast标志。

\n

在 Bazel 中,您可以使用选项传递 C/C++ 构建选项--copt="<flag>"(请参阅此处)(另请参阅--per_file_copt选项(请参阅此处此处)),使最终命令在本例中如下所示:

\n
time bazel build --copt="-Wno-error=undefined-reinterpret-cast" //my/src/...\n
Run Code Online (Sandbox Code Playgroud)\n

这有效!Bazel 构建现在运行完成,仅再次将这些问题显示为警告(-Werror现在警告声明中缺少通知):

\n
\n
...has undefined behavior [-Wundefined-reinterpret-cast]\n
Run Code Online (Sandbox Code Playgroud)\n
\n

请注意,如果您需要一次传递多个构建标志,请使用对--copt=. 前任:

\n
time bazel build --copt="-Wno-error=undefined-reinterpret-cast" \\\n--copt="-Wno-error=switch" --copt="-ggdb" --copt="-O0" //my/src/...\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

这会让你继续前进,但是转向有关潜在阴暗的警告reinterpret_casts会让我感到惶恐不安。
\n\xe2\x80\x93 user4581301
\n2020 年 9 月 29 日 0:10

\n

它不适用于生产代码。只是为了size使用各种技术收集编译二进制文件的一些输出数据。我同意:禁用这个特定的警告对于生产代码来说是一个坏主意。但是,这个答案是一个通用示例,说明该过程如何寻找更良性的警告,为此目的,这个答案正是我所需要的。
\n\xe2\x80\x93 加布里埃尔·斯台普斯
\n2020 年 9 月 29 日 0:13

\n
\n

更多阅读:

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