“与”的区别是什么-c opt";及--copt=-O3";在Bazel构建中(或GCC)

“与”的区别是什么-c opt";及--copt=-O3";在Bazel构建中(或GCC),gcc,compiler-optimization,bazel,Gcc,Compiler Optimization,Bazel,我正在学习GCC和Bazel。我想为Bazel启用所有优化,以构建一个需要最佳性能的项目 然后我找到了-c opt,这意味着在没有调试信息的情况下将编译模式设置为优化 和--copt=-O3表示将优化级别设置为第三级。有-O2,-Os等 我对这两种选择感到困惑 -c opt和-copt=-O3之间有什么区别 他们会互相触发吗。因此,我只需要使用bazel build编写其中一个 --copt用于将参数传递给编译器 -c是。 其效果如以下所述: 它设置编译器选项(例如-c opt意味着-O2-D

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

然后我找到了
-c opt
,这意味着在没有调试信息的情况下将编译模式设置为优化

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

我对这两种选择感到困惑

  • -c opt
    -copt=-O3
    之间有什么区别
  • 他们会互相触发吗。因此,我只需要使用
    bazel build
    编写其中一个
  • --copt
    用于将参数传递给编译器

    -c
    是。 其效果如以下所述:

    • 它设置编译器选项(例如
      -c opt
      意味着
      -O2-DNDEBUG
    • 每个编译模式有不同的输出目录,因此您可以在调试和优化版本之间切换,而无需完全重新编译
    所以通常,
    -c opt
    就足够了。如果您想要
    -c opt
    的行为,但需要不同的优化级别,那么可以将两个选项组合在一起,如
    -c opt--copt=-O3
    ,编译器将获得两个选项
    -O2
    -O3
    ,但最后一个选项将获胜

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

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

    build:opt --copt=-O3
    

    然后,
    bazel build--config=opt
    bazel build--copt=-O3

    具有相同的效果,非常感谢!我还发现有人提到--config=opt。现在一切都清楚了。