CMake和VS似乎有一种相当奇怪的关系。我想弄清楚为什么设置CMAKE_BUILD_TYPE
不影响生成的Visual Studio解决方案和项目的构建。
例如(使用CMake GUI)我有以下在我的CMakeLists.txt
(这纯粹是为了调试目的):
if(NOT CMAKE_BUILD_TYPE)
message(WARNING "CMAKE_BUILD_TYPE is not set. Fallback to default: ReleasenSupported build types:n - Releasen - Debug")
set(CMAKE_BUILD_TYPE "Release")
endif()
由于我没有在GUI中设置CMAKE_BUILD_TYPE
,因此该变量为空,因此内部设置为Release
。
然而,在配置步骤结束后,在表中设置变量(GUI),我清楚地看到
CMAKE_CXX_FLAGS_RELEASE /O2 /Ob2 /DNDEBUG
CMAKE_C_FLAGS_RELEASE /O2 /Ob2 /DNDEBUG
在其他具有值的变量中,表明我已经清楚地配置了Debug
构建。
除了在平台到平台的基础上手动设置CMAKE_CXX_FLAGS
等,实际上有没有一种方法可以简单地设置构建类型,最好只是通过改变CMAKE_BUILD_TYPE
的值?
如果你谈论的是/DNDEBUG
,这实际上表明Release
的构建。
这个定义意味着"而不是调试"并调用assert()
函数为no-op。更多信息在这里。
所有其他标志控制优化级别,O2
和Ob2
的值也主要用于非调试构建。
CMAKE_BUILD_TYPE
对VS项目没有影响的原因是,与"Unix makefile"VS生成器是一个多配置生成器。这意味着你使用VS生成器设置的每个项目同时提供多个配置(发布,调试等),但使用"Unix makefile"设置相同的项目;您需要决定一个配置(或使用默认配置)。
配置的决定被"延迟"了。用于多配置生成器。对于单个配置生成器,使用
cmake --build <dir>
来构建项目,对于多配置项目,使用
cmake --build <dir> --config <config>
(<dir>
被替换为构建目录,<config>
被替换为Debug
、Release
或命令中的其他可用配置之一)