Gab*_*les 3 c++ gcc build clang bazel
我在构建时遇到以下错误:
Run Code Online (Sandbox Code Playgroud)...has undefined behavior [-Werror,-Wundefined-reinterpret-cast]
Bazel 构建完全停止,因为这个clang(llvm 编译器)-Wundefined-reinterpret-cast警告被 转换为构建错误-Werror。
尽管出现此构建错误,如何强制构建继续并生成二进制可执行文件?
请注意,我的 bazel 构建命令具有以下形式:
time bazel build //my/src/...
Run Code Online (Sandbox Code Playgroud)
答案是使用-Wno-error=<name>构建标志,如 gcc 此处所述(请注意,clang 的选项是根据 gcc 建模的):
\n\n\n
-Werror=将指定的警告变为错误。附加警告说明符;例如
\n-Werror=switch将由 控制的警告变成-Wswitch错误。该开关采用否定形式,用于否定-Werror特定警告;例如,即使-Wno-error=switch警告有效-Wswitch,也不会成为错误。-Werror每个可控警告的警告消息包括控制警告的选项。
\n-Werror=然后,该选项可以与和 一起使用,-Wno-error=如上所述。
资料来源: https: //gcc.gnu.org/onlinedocs/gcc/Warning-Options.html(强调已添加)。
\n因此,对于这种情况,请添加构建选项-Wno-error=undefined-reinterpret-cast以关闭该-Werror=undefined-reinterpret-cast标志。
在 Bazel 中,您可以使用选项传递 C/C++ 构建选项--copt="<flag>"(请参阅此处)(另请参阅--per_file_copt选项(请参阅此处和此处)),使最终命令在本例中如下所示:
time bazel build --copt="-Wno-error=undefined-reinterpret-cast" //my/src/...\nRun Code Online (Sandbox Code Playgroud)\n这有效!Bazel 构建现在运行完成,仅再次将这些问题显示为警告(-Werror现在警告声明中缺少通知):
\n\nRun Code Online (Sandbox Code Playgroud)\n...has undefined behavior [-Wundefined-reinterpret-cast]\n
请注意,如果您需要一次传递多个构建标志,请使用对--copt=. 前任:
time bazel build --copt="-Wno-error=undefined-reinterpret-cast" \\\n--copt="-Wno-error=switch" --copt="-ggdb" --copt="-O0" //my/src/...\nRun Code Online (Sandbox Code Playgroud)\n注意:永远不要在生产代码中对此类潜在严重警告(例如:未定义的行为)执行此操作。对于更良性的警告,如果您确实需要禁用警告,那么这是正确的技术。对于未定义的行为,这应该只是为了学习。请参阅此答案下面的评论:
\n\n\n这会让你继续前进,但是转向有关潜在阴暗的警告
\nreinterpret_casts会让我感到惶恐不安。
\n\xe2\x80\x93 user4581301
\n2020 年 9 月 29 日 0:10它不适用于生产代码。只是为了
\nsize使用各种技术收集编译二进制文件的一些输出数据。我同意:禁用这个特定的警告对于生产代码来说是一个坏主意。但是,这个答案是一个通用示例,说明该过程如何寻找更良性的警告,为此目的,这个答案正是我所需要的。
\n\xe2\x80\x93 加布里埃尔·斯台普斯
\n2020 年 9 月 29 日 0:13
gcc或clang编译器)”的部分中记录了上述大量信息以及更多信息,请参见此处。阅读此处了解更多信息。#pragma语句放在头文件#include语句的上方和下方,以仅影响这些文件。| 归档时间: |
|
| 查看次数: |
8337 次 |
| 最近记录: |