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

mpo*_*llo 11 cmake

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

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

mpo*_*llo 23

这篇博文有一些有用的信息,这篇文章描述了一些常见的反模式.

该CMake的包括开箱即用的四个构建类型是Release,Debug,RelWithDebInfo,和MinSizeRel.相应地,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}")
Run Code Online (Sandbox Code Playgroud)

在我的版本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
Run Code Online (Sandbox Code Playgroud)

(正如您所看到的,默认情况下,C和C++的标志集是相同的.)

要小心,因为默认构建类型是一个空字符串.因此,除非您指定构建类型,否则以上都不适用.对于那些不希望这种行为的人,在cmake邮件列表中,建议使用以下代码(应该放在顶层顶部CMakeLists.txt,我想象):

if (NOT CMAKE_BUILD_TYPE)
    message(STATUS "No build type selected, default to Release")
    set(CMAKE_BUILD_TYPE "Release")
endif()
Run Code Online (Sandbox Code Playgroud)

但是,不建议这样做,因为它会破坏一些mutli配置生成器.(最好将其设置在构建脚本中.)

(上面提到的一篇博文主张使用shell别名来设置-DCMAKE_BUILD_TYPE=Debug何时cmake首次调用.)

  • 您提到的所有帖子和您的答案本身(`if (NOT CMAKE_BUILD_TYPE)` 部分)不适用于多配置生成器。见我的[答案](http://stackoverflow.com/a/24470998/2288008) (2认同)
  • 这个 [post](http://ecrafter.wordpress.com/2012/04/24/cmake-tutorial-part-2/) 本身包含一些反模式,比如构建源代码 (`cmake .`)、设置编译器标志由 add_definitions 命令(` add_definitions(-Wall -std=c++0x)`)和重写用户定义的标志(set(CMAKE_CXX_FLAGS "-std=c++0x -Wall")) (2认同)