我在构建时遇到以下错误:
...has undefined behavior [-Werror,-Wundefined-reinterpret-cast]
Bazel 构建完全停止,因为此 clang(llvm 编译器)
-Wundefined-reinterpret-cast
警告 被 -Werror
转换为构建错误。
尽管出现此构建错误,如何强制构建继续并生成二进制可执行文件?
请注意,我的 bazel 构建命令具有以下形式:
time bazel build //my/src/...
答案是使用
-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
选项(参见 here 和 here)),使最终命令看起来像对于这种情况:
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
gcc
或 clang
编译器)”的部分中记录了上述大量信息以及更多信息,此处。阅读此处了解更多信息。#pragma
语句放在头文件 #include
语句的上方和下方,以仅影响这些文件。弃用警告
bazel build --javacopt=-Xlint:-deprecation //...
您可以在
.bazelrc
步骤之后将此选项添加到您的
build