如果您不设置CMAKE_BUILD_TYPE,则默认情况下不会缓存它。我应该缓存它吗?例如我应该有:
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" )
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Type of build (Debug, Release etc." FORCE)
endif()
Run Code Online (Sandbox Code Playgroud)
要不就:
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" )
endif()
Run Code Online (Sandbox Code Playgroud)
或者这并不重要?
CMAKE_BUILD_TYPE的缓存对于 cmake-gui 很有用:项目的用户能够以良好的方式更改构建类型。
Kitware有一个很好的模板用于设置默认CMAKE_BUILD_TYPE :
# Set a default build type if none was specified
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "Setting build type to 'Debug' as none was specified.")
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE)
# Set the possible values of build type for cmake-gui
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
"MinSizeRel" "RelWithDebInfo")
endif()
Run Code Online (Sandbox Code Playgroud)
CMAKE_BUILD_TYPE在CMake的缓存中用户通常会CMAKE_BUILD_TYPE通过命令行使用cmake -D .... 所以这确实生成了一个缓存条目。
即使您没有提供CMAKE_BUILD_TYPE单个配置 makefile 生成器,CMake 也会自动创建一个空的缓存条目(因此用户可以在例如中选择cmake-gui):
//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or
// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.
CMAKE_BUILD_TYPE:STRING=
Run Code Online (Sandbox Code Playgroud)
如果 CMake 的平台/编译器定义没有通过 for给出CMAKE_BUILD_TYPE默认值:CMAKE_BUILD_TYPE_INITWindows-MSVC
# default to Debug builds
set(CMAKE_BUILD_TYPE_INIT Debug)
Run Code Online (Sandbox Code Playgroud)
CMAKE_BUILD_TYPE所以是的,如果您想强制在 GUI 中可见的默认值,请设置缓存变量(请参阅@Tsyvarev 答案)。
我通常不会强制缓存默认值,如果没有给出,我只是设置一个临时值。这允许例如我的项目用作子项目。
但这更多取决于您的个人品味。
在我的项目中,这些默认CMAKE_BUILD_TYPE检查看起来有点复杂,因为我允许更多用例:
# Make RelWithDebInfo the default (it does e.g. add '-O2 -g -DNDEBUG' for GNU)
# If not in multi-configuration environments, no explicit build type
# is set by the user and if we are the root CMakeLists.txt file.
if (NOT CMAKE_CONFIGURATION_TYPES AND
NOT CMAKE_NO_BUILD_TYPE AND
NOT CMAKE_BUILD_TYPE AND
CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
set(CMAKE_BUILD_TYPE RelWithDebInfo)
endif()
if (CMAKE_BUILD_TYPE)
string(TOUPPER "_${CMAKE_BUILD_TYPE}" MY_PROJECT_BUILD_TYPE_EXT)
endif()
# Choose a configuration for our compiler tests
if (NOT CMAKE_CONFIGURATION_TYPES AND
NOT CMAKE_NO_BUILD_TYPE)
set(CMAKE_TRY_COMPILE_CONFIGURATION "${CMAKE_BUILD_TYPE}")
else()
set(CMAKE_TRY_COMPILE_CONFIGURATION RelWithDebInfo)
endif()
Run Code Online (Sandbox Code Playgroud)
但也许我应该更新此代码以考虑新的GENERATOR_IS_MULTI_CONFIG全局属性(而不是检查CMAKE_NO_BUILD_TYPE)。