我在构建时遇到以下错误:
...has undefined behavior [-Werror,-Wundefined-reinterpret-cast]
Bazel构建完全停止,因为这个clang(llvm编译器)-Wundefined-reinterpret-cast警告被-Werror转换为构建错误。我如何强制构建继续并产生二进制可执行文件,尽管有此构建错误?请注意,我的bazel build命令具有以下形式:
-Wundefined-reinterpret-cast
-Werror
time bazel build //my/src/...
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选项(参见这里和这里)),使最终的命令看起来像这样:
-Wno-error=<name>
-Werror=
-Werror=switch
-Wswitch
-Wno-error=switch
-Wno-error=
-Wno-error=undefined-reinterpret-cast
-Werror=undefined-reinterpret-cast
--copt="<flag>"
--per_file_copt
time bazel build --copt="-Wno-error=undefined-reinterpret-cast" //my/src/...
Bazel构建现在运行完成,再次将这些问题显示为警告(注意,现在警告语句中缺少-Werror):
...has undefined behavior [-Wundefined-reinterpret-cast]
请注意,如果您需要一次传入多个构建标志,请使用对--copt=的多个调用。例如:
--copt=
time bazel build --copt="-Wno-error=undefined-reinterpret-cast" \ --copt="-Wno-error=switch" --copt="-ggdb" --copt="-O0" //my/src/...
这会让你继续下去,但是关于潜在的可疑reinterpret_casts的警告有点让我紧张。
reinterpret_casts
size
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语句的上方和下方,以仅影响这些文件。
gcc
clang
#pragma
#include
1条答案
按热度按时间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
选项(参见这里和这里)),使最终的命令看起来像这样:Bazel构建现在运行完成,再次将这些问题显示为警告(注意,现在警告语句中缺少
-Werror
):请注意,如果您需要一次传入多个构建标志,请使用对
--copt=
的多个调用。例如:这会让你继续下去,但是关于潜在的可疑
reinterpret_casts
的警告有点让我紧张。2020年9月29日在0:10
这不是生产代码。只是为了收集一些
size
输出数据的编译二进制文件使用各种技术。我同意:禁用这个特殊的警告对生产代码来说是一个糟糕的想法。但是,这个答案是一个通用的例子,说明这个过程如何寻找更良性的警告,为此,这个答案正是我所需要的。2020年9月29日在0:13
更多阅读:
1.我已经在我的eRCaGuy_hello_world repo中记录了大量上述信息,以及更多信息,标题为“其他C和C++构建说明(例如:w/
gcc
orclang
compilers)"。阅读这里了解更多。1.[我仍然需要尝试和测试这一点] https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/-见esp。第3.3节“通过控制诊断堆栈抑制故障”。学习仅为某些文件或代码段启用/禁用GCC和Clang编译器警告和选项。考虑将必要的
#pragma
语句放在头文件#include
语句的上方和下方,以仅影响这些文件。