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

zdwk9cvp  于 7个月前  发布在  C/C++
关注(0)|答案(1)|浏览(160)

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

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

Bazel构建完全停止,因为这个clang(llvm编译器)-Wundefined-reinterpret-cast警告被-Werror转换为构建错误。
我如何强制构建继续并产生二进制可执行文件,尽管有此构建错误?
请注意,我的bazel build命令具有以下形式:

time bazel build //my/src/...
bgtovc5b

bgtovc5b1#

答案是使用-Wno-error=<name>构建标志as described by gcc here(注意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++构建选项(参见这里)(另请参见--per_file_copt选项(参见这里和这里)),使最终的命令看起来像这样:

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 repo中记录了大量上述信息,以及更多信息,标题为“其他C和C++构建说明(例如:w/ gcc or clang compilers)"。阅读这里了解更多。
1.[我仍然需要尝试和测试这一点] https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/-见esp。第3.3节“通过控制诊断堆栈抑制故障”。学习仅为某些文件或代码段启用/禁用GCC和Clang编译器警告和选项。考虑将必要的#pragma语句放在头文件#include语句的上方和下方,以仅影响这些文件。

相关问题