如何在 Bazel 中使用 clang++ 而不是 g++

how to use clang++ instead g++ in Bazel

我想使用 clang++ 而不是 g++ 来编译我的 c++ 文件,而 g++ 是系统的默认编译器。

我已经尝试 sudo update-alternatives --install c++ c++ /home/guo/bin/clang++ 100 并设置了 CC 环境。但它们不起作用。 Bazel 仍然使用 g++ 作为编译器。


一个小时后,Bazel 使用 clang++。但是出现错误。

ERROR: /home/guo/utils/lib/BUILD:2:1: C++ compilation of rule '//utils/lib:get_pdf' failed: linux-sandbox failed: error executing command /home/guo/.cache/bazel/_bazel_guo/d2d93a82f24e8dc5485ac1b29928428e/execroot/_bin/linux-sandbox ... (remaining 41 argument(s) skipped).
src/main/tools/linux-sandbox-pid1.cc:592: "execvp(/home/guo/lib/clang, 0x23abde0)": Permission denied
Target //utils/lib:get_pdf failed to buildenter code here
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 0.159s, Critical Path: 0.06s

Ps: /home/guo/lib/clang是一个目录,不是我电脑里的二进制文件。我猜这里应该是 /home/guo/bin/clang++ 但我不知道如何让 Bazel 知道。


Ps: 看来你在更改环境后需要重新启动Bazel服务器。

要指定哪个 C/C++ 编译器,Bazel 中的默认 C++ 工具链应使用设置 CC 环境变量(例如 CC=clang bazel build //...)。

您可以使用 --repo_env 选项,例如--repo_env=CC=clang,将此默认值放入您的项目中 - 或 system-wide .bazelrc

默认的 Bazel C++ 工具链使用系统安装的编译器、headers 和库,而不尝试在 BUILD 文件中声明所有相关文件。这是为了简化用户的配置。因此,每当您以 Bazel 无法知道的方式修改 C++ 工具链(升级编译器的主要版本、将符号链接从 gcc 切换到 clang、使用 headers 更改目录等)时,您必须 运行 bazel clean --expunge 刷​​新缓存并在下次重新运行 自动配置。

在 Bazel 中指定 C++ 工具链的可靠解决方案是使用 CcToolchainConfigInfo。请参阅 https://docs.bazel.build/versions/master/tutorial/cc-toolchain-config.html and https://docs.bazel.build/versions/master/cc-toolchain-config-reference.html 处的文档。