【问题标题】:Using cmake, how do you determine the default compiler flags per build type?使用 cmake,您如何确定每种构建类型的默认编译器标志?
【发布时间】:2014-07-15 20:20:37
【问题描述】:

我正在尝试配置我的构建系统,以便我的发布版本不包含额外的调试。但是我在 CMake 文档中找不到列出每个构建类型默认使用的编译器标志的任何地方,我宁愿不发明自己的做事方式。

此功能是否已经存在?在不进行反复试验的情况下,如何确定默认情况下对各种构建类型使用哪些标志?

【问题讨论】:

标签: cmake


【解决方案1】:

This blog post 提供了一些有用的信息,this post 描述了一些常见的反模式。

CMake 开箱即用的四种构建类型是ReleaseDebugRelWithDebInfoMinSizeRel。相应地,CMake 在CMAKE_C_FLAGS_<buildType>CMAKE_CXX_FLAGS_<buildType> 中为每个定义的构建类型提供了默认值。

如果您想了解每种构建类型的默认值是什么,可以将以下语句添加到您的CMakeLists.txt

message("CMAKE_C_FLAGS_DEBUG is ${CMAKE_C_FLAGS_DEBUG}")
message("CMAKE_C_FLAGS_RELEASE is ${CMAKE_C_FLAGS_RELEASE}")
message("CMAKE_C_FLAGS_RELWITHDEBINFO is ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
message("CMAKE_C_FLAGS_MINSIZEREL is ${CMAKE_C_FLAGS_MINSIZEREL}")

message("CMAKE_CXX_FLAGS_DEBUG is ${CMAKE_CXX_FLAGS_DEBUG}")
message("CMAKE_CXX_FLAGS_RELEASE is ${CMAKE_CXX_FLAGS_RELEASE}")
message("CMAKE_CXX_FLAGS_RELWITHDEBINFO is ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
message("CMAKE_CXX_FLAGS_MINSIZEREL is ${CMAKE_CXX_FLAGS_MINSIZEREL}")

在我的 cmake 版本(OS X 上的 cmake 版本 2.8.12.1)上,这会打印以下值:

CMAKE_C_FLAGS_DEBUG is -g
CMAKE_C_FLAGS_RELEASE is -O3 -DNDEBUG
CMAKE_C_FLAGS_RELWITHDEBINFO is -O2 -g -DNDEBUG
CMAKE_C_FLAGS_MINSIZEREL is -Os -DNDEBUG

CMAKE_CXX_FLAGS_DEBUG is -g
CMAKE_CXX_FLAGS_RELEASE is -O3 -DNDEBUG
CMAKE_CXX_FLAGS_RELWITHDEBINFO is -O2 -g -DNDEBUG
CMAKE_CXX_FLAGS_MINSIZEREL is -Os -DNDEBUG

(如您所见,默认情况下,C 和 C++ 的标志集是相同的。)

要小心,因为默认构建类型是空字符串。因此,除非您指定构建类型,否则以上均不适用。在cmake mailing list 上,为那些不希望这种行为的人建议了以下代码(我想应该放在顶级CMakeLists.txt 的顶部附近):

if (NOT CMAKE_BUILD_TYPE)
    message(STATUS "No build type selected, default to Release")
    set(CMAKE_BUILD_TYPE "Release")
endif()

但是,这是not recommended,因为它会破坏一些多配置生成器。 (最好在构建脚本中设置。)

(上面的一篇博文提倡在第一次调用cmake 时使用shell 别名来设置-DCMAKE_BUILD_TYPE=Debug。)

【讨论】:

  • 您提到的所有帖子和您的答案本身(if (NOT CMAKE_BUILD_TYPE) 部分)都不适用于多配置生成器。见我的answer
  • 这个post 本身包含一些反模式,例如在源代码中构建 (cmake .),通过 add_definitions 命令设置编译器标志 (` add_definitions(-Wall -std=c++0x) `) 并重写用户定义的标志 (set(CMAKE_CXX_FLAGS "-std=c++0x -Wall")))
  • @ruslo,谢谢。我将编辑我的答案,以明确检查是否定义了构建类型不是可移植的解决方案。 (我链接到帖子以表扬,因为部分答案是复制/粘贴然后展开的。)
  • 如果你想检查 cmake 默认标志,你可以在 /usr/share/cmake-/Modules/Compiler/GNU.cmake 文件中看到它们。
  • 从 3.22 开始,默认构建类型由 project 命令初始化。对于早期版本,您只需将AND NOT GENERATOR_IS_MULTI_CONFIG 添加到条件中即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
相关资源
最近更新 更多