使用cmake,如何确定每种构建类型的默认编译器标志?

时间:2014-07-15 20:20:37

标签: cmake

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

此功能是否已存在?如果不采用试验和错误,我如何确定默认情况下为各种构建类型使用哪些标志?

1 个答案:

答案 0 :(得分:19)

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,因为它会破坏一些mutli配置生成器。 (最好将其设置在构建脚本中。)

(上面的一篇博客文章主张在首次调用-DCMAKE_BUILD_TYPE=Debug时使用shell别名设置cmake。)