我可以避免显式指定编译器标志以获得良好优化的构建吗?

问题描述 投票:0回答:1

假设我有一个 CMake 项目,它生成一个 CPU 密集型应用程序。

当我为二进制分发或性能基准测试构建二进制文件时,我希望它们能够得到最大程度的优化,或者至少是高度优化。当我浏览 CMake 文档时,如果我使用

Release
构建类型(例如,对于 GCC,诸如
-O3 -march=native
之类的标志,也许还有其他标志),我不太能保证会为我完成类似的事情。

当然,我可以设置

CMAKE_<LANG>_FLAGS_RELEASE
变量,在我的具体情况下为
CMAKE_CPP_FLAGS_RELEASE
。但是 - 然后我需要(忽略交叉构建):

  • 确定我所在的平台
  • 确定我的目标处理器的功能
  • 确定我正在使用的编译器以及该编译器的版本

基于此 - 以及哪些编译器提供哪种优化以及如何启用它们的知识 - 我可以设置这些标志,例如在辅助模块中。

但是 - 这些都不是特定于我的项目的。我的意思是,理论上可能会有一些调整,但大多数都是非常通用的。为什么 CMake 不为我做这件事?个人开发人员更有可能错过一些晦涩的标志,甚至放弃设置任何标志并假设一切都已处理完毕。我的意思是,它是 CMake - 开发人员肯定知道发布版本需要优化,对吗?

...所以,如果不把事情交给 CMake 来处理——对于许多编译器和跨多个平台来说,什么是通用的(ish)、惯用的、希望广泛使用的方法来在 CMake 中启用“完整”优化?

c++ cmake compiler-flags
1个回答
1
投票

在 CMake 中,使用

Release
构建类型自动应用常规优化,例如针对 GCC/Clang 的
-03
。对于特定优化,例如
-march=native
,请在 CMakeLists.txt 中手动设置
CMAKE_CXX_FLAGS_RELEASE

© www.soinside.com 2019 - 2024. All rights reserved.