This blog post 提供了一些有用的信息,this post 描述了一些常见的反模式。
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}")
在我的 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。)