Bazel 构建(或 GCC)中的“-c opt”和“--copt=-O3”有什么区别

What is the difference between "-c opt" and "--copt=-O3" in Bazel build (or GCC)

我正在学习 GCC 和 Bazel。我想启用 Bazel 的所有优化来构建一个需要最佳性能的项目。

然后我找到了-c opt意思就是把编译模式设置为optimized without debug information

而--copt=-O3表示将优化级别设置为第三级。有-O2-Os

我对这两个选项感到困惑。

  1. -c opt--copt=-O3有什么区别?
  2. 他们会不会互相触发。所以我只需要写其中一个 bazel build?

--copt 用于将参数传递给编译器。

-c--compilation-mode 的缩写形式。 user-manual中描述了它的作用:

  • 它设置编译器选项(例如 -c opt 表示 -O2 -DNDEBUG
  • 每种编译模式都有不同的输出目录,因此您可以在调试和优化构建之间切换而无需完全重新编译。

所以通常,-c opt就足够了。如果你想要 -c opt 的行为但具有不同的优化级别,你可以像 -c opt --copt=-O3 中那样组合两个选项,编译器将获得两个选项 -O2-O3,但是最后一个会赢。

注意,还有第三个类似的选项:

--config=configname用于选择配置。你可以有一个 .bazelrc 来定义默认选项。其中一些并不总是处于活动状态,但有些只有在您通过 --config=configname 命令行选项激活它们时才会激活。现在 opt 是一个流行的配置名称,所以如果你有一个包含

.bazelrc
build:opt --copt=-O3

bazel build --config=optbazel build --copt=-O3

效果相同