是否有一种跨平台的方式来设置用cmake生成的项目的构建类型?



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。更多信息在这里。

所有其他标志控制优化级别,O2Ob2的值也主要用于非调试构建。

CMAKE_BUILD_TYPE对VS项目没有影响的原因是,与"Unix makefile"VS生成器是一个多配置生成器。这意味着你使用VS生成器设置的每个项目同时提供多个配置(发布,调试等),但使用"Unix makefile"设置相同的项目;您需要决定一个配置(或使用默认配置)。

配置的决定被"延迟"了。用于多配置生成器。对于单个配置生成器,使用

cmake --build <dir>

来构建项目,对于多配置项目,使用

cmake --build <dir> --config <config>

(<dir>被替换为构建目录,<config>被替换为DebugRelease或命令中的其他可用配置之一)

最新更新