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

Yu *_*ang 2 gcc compiler-optimization bazel

我正在学习GCC和Bazel。我想对bazel启用所有优化,以构建需要最佳性能的项目。

然后我发现“ -c opt”,这意味着将编译模式设置为没有调试信息就可以优化。

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

我对这两种选择感到困惑。

1)“ -c opt”和“ --copt = -O3”有什么区别?2)他们会互相触发。所以我只需要用bazel build编写其中之一?

Til*_*hcy 9

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

-c--compilation-mode缩写。其效果在用户手册中进行了描述:

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

因此通常-c opt就足够了。如果您想要的行为-c opt却具有不同的优化级别,则可以组合使用in -c opt --copt=-O3和in这样的两个选项,编译器将同时获得-O2-O3,但是最后一个将获胜。

请注意,还有第三种类似的选择:

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

build:opt --copt=-O3
Run Code Online (Sandbox Code Playgroud)

然后bazel build --config=opt具有与bazel build --copt=-O3