75

我正在尝试在发布模式下构建一个项目。默认情况下,它是在调试模式下构建的。我正在将变量设置CMAKE_BUILD_TYPE为“发布” CMakeLists.txt。但它仍在调试模式下构建项目。当我在 CMake 命令中将“发布”作为构建类型传递时,它仍然不起作用。

我正在使用的 CMake 命令是:

cmake -G"Visual Studio 10" -DCMAKE_BUILD_TYPE=Release
  -H"source_path" -B"Build path"

如果有请提供解决方案。

4

6 回答 6

198

要更改构建类型,在 Windows 上,必须在构建时完成:

cmake --build {DIR} --config Release

默认情况下它是调试。我仍在寻找更改此默认值的方法。CMAKE_BUILD_TYPE 当然不起作用,调整 CMAKE_CONFIGURATION_TYPES 也不起作用,显然出于同样的原因,它们仅适用于 Unix makefile,不适用于 Visual 项目。

于 2013-12-06T12:21:56.470 回答
48

我用 Visual Studio 2015 和 cmake 3.3 检查了它。

简短的回答

关联

cmake --build {BUILD_DIR_PATH} --target ALL_BUILD --config {BUILD_TYPE}

例子

cmake --build . --target ALL_BUILD --config Release

长答案

cmake -G{GENERATOR_NAME} -B{BUILD_DIR_PATH} -H{SOURCE_DIR_PATH}

cmake --build {BUILD_DIR_PATH} --target ALL_BUILD --config {BUILD_TYPE}

例子

cmake -GVisual Studio 14 -Bbuild/win32/x86 -H.    

cmake --build build/win32/x86 --target ALL_BUILD --config Release

附加信息

  • “-G” - 指定生成器名称

  • “-B” - 指定构建文件夹的路径

  • “-H” - 指定源文件夹的路径

于 2016-02-23T14:39:12.610 回答
25

您无法从命令行设置 Visual Studio 的默认构建类型。

CMake 的 Visual Studio 生成器将生成四个标准配置文件(Debug、RelWithDebInfo、MinSizeRel 和 Release),您必须在 VS 中选择要构建的配置文件。这是因为有关活动配置的信息不是 CMake 生成的项目文件的一部分,而是.suoVS 生成的文件的一部分。

如果您想要自动构建特定配置,请使用 MSBuild 而不是 VS,它允许您在命令行上指定配置。

于 2013-09-26T10:53:23.797 回答
6

尝试了以下对我有用的东西,以在 Windows 中以发布/调试模式构建二进制文件。

在根文件中添加以下行CMakeLists.txt,就在项目命令的上方:

SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "" FORCE)

使用以下命令设置发布模式配置:

cmake -DCMAKE_BUILD_TYPE=Release .. 

使用此命令在发布模式下构建相同的:

cmake --build . --config Release

您也可以对调试模式重复相同的过程,它可以工作。

于 2020-10-15T17:55:23.407 回答
1

有点晚了,但我发现这对我有用,而且很干净:这意味着只cmake在发布模式下调用构建,但如果你想要调试模式,只需调用cmake -DCMAKE_BUILD_TYPE=Debug

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose Release or Debug" FORCE)
endif()
于 2021-12-10T11:00:53.267 回答
-23

照常使用它,但在根 cmake 文件中,在项目关键字之前添加以下内容

SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "" FORCE)
PROJECT(MY_PROJECT)#It's here just to show where you should add it.
于 2013-09-26T13:36:23.107 回答