gpt4 book ai didi

c++ - 如何在 Bazel 中禁用 C/C++ `-Werror` 构建错误? (又名 : how to turn OFF specific warnings already turned on by `-Wall -Werror` )

转载 作者:行者123 更新时间:2023-12-05 02:04:45 25 4
gpt4 key购买 nike

构建时出现以下错误:

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

Bazel 构建完全停止,因为 clang (llvm compiler) -Wundefined-reinterpret-cast warning-Werror转化为构建错误。

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

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

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

最佳答案

答案是使用 -Wno-error=<name>构建标志,as described by gcc here (注意 clang 的选项是仿照 gcc 的):

-Werror=

Make the specified warning into an error. The specifier for a warning is appended; for example -Werror=switch turns the warnings controlled by -Wswitch into errors. This switch takes a negative form, to be used to negate -Werror for specific warnings; for example -Wno-error=switch makes -Wswitch warnings not be errors, even when -Werror is in effect.

The warning message for each controllable warning includes the option that controls the warning. That option can then be used with -Werror= and -Wno-error= as described above.

来源: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/...

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

更多阅读:

  1. 我在我的 eRCaGuy_hello_world 中记录了很多上述信息以及更多信息在标题为 "Additional C and C++ build notes (ex: w/ gcc or clang compilers)", here 的部分下 repo .阅读此处了解更多信息。
  2. [我仍然需要尝试和测试它] https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/ - 见esp。 “3.3 通过控制诊断堆栈来抑制警告”一节。了解仅针对特定文件或代码段启用/禁用 GCC 和 Clang 编译器警告和选项。考虑把必要的 #pragma头文件上方和下方的语句 #include语句只影响那些文件。

关于c++ - 如何在 Bazel 中禁用 C/C++ `-Werror` 构建错误? (又名 : how to turn OFF specific warnings already turned on by `-Wall -Werror` ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64111153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com