Windows 如何在cmake中将构建类型更改为发布模式?

Windows 如何在cmake中将构建类型更改为发布模式?,windows,visual-studio-2010,cmake,Windows,Visual Studio 2010,Cmake,我正在尝试以发布模式构建一个项目。默认情况下,它是在调试模式下构建的。我正在CMakeLists.txt中将变量CMAKE\u BUILD\u TYPE设置为“Release”。但它仍在以调试模式构建项目。 当我在CMake命令中将“Release”作为构建类型传递时,它仍然不起作用 我正在使用的CMake命令是: cmake -G"Visual Studio 10" -DCMAKE_BUILD_TYPE=Release -H"source_path" -B"Build path" 如果有

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

我正在使用的CMake命令是:

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

如果有,请提供解决方案。

无法从命令行设置Visual Studio的默认生成类型

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


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

按原样使用,但在根cmake文件中,在项目关键字之前添加以下内容


要在Windows上更改生成类型,必须在生成时进行:

cmake --build {DIR} --config Release

默认情况下是调试。我仍然在寻找一种方法来改变这个默认值。当然,CMAKE_BUILD_类型不起作用,调整CMAKE_CONFIGURATION_类型也不起作用,显然出于同样的原因,它们只适用于Unix makefiles,而不适用于Visual项目。

我使用Visual Studio 2015和CMAKE 3.3进行了检查

简短回答

范例


长话短说

范例

附加信息

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

  • “-B”-指定生成文件夹的路径

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


我尝试了以下方法,在Windows中以发布/调试模式构建二进制文件

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

SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "" FORCE)
使用以下命令设置释放模式配置:

cmake -DCMAKE_BUILD_TYPE=Release .. 
使用此命令在发布模式下生成相同的版本:

cmake --build . --config Release

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

尝试使用
cmake-DCMAKE\u BUILD\u TYPE=Release-H“soruce\u path”-B“Buidl path”-G“Visual Studio 10”
它给出了相同的结果。它仅在调试模式下生成项目。CMAKE_CONFIGURATION_TYPES指定可用的生成类型。这指定了可用的构建类型,例如Debug、Release、RelWithDebInfo等。这在大多数平台上都有合理的默认值。但是可以扩展以提供其他构建类型。另请参见CMAKE_BUILD_TYPE。CMAKE_BUILD_TYPE指定基于make的生成器的生成类型。这指定将在此树中生成的生成类型。可能的值为空、Debug、Release、RelWithDebInfo和Min-SizeRel。仅基于make的生成器支持此变量。如果支持此变量,则CMake还将为名为CMake_C_FLAGS_[Debug | Release | RelWithDebInfo | MinSizeRel]的变量提供初始值。例如,如果CMAKE_BUILD_TYPE为Debug,则CMAKE_C_FLAGS_Debug将被添加到CMAKE_C_FLAGS中。如果这两个选项中的任何一个都有效,您可以使用这两个选项。那么CMAKE_BUILD_TYPE的用途是什么呢?@123r789例如,它用于生成文件生成器,该生成器当时只允许一个配置文件。像VS这样的IDE生成器一次生成多个概要文件,并允许从IDE中选择一个概要文件。对于Makefiles,您只有一个配置文件,因此必须在CMake配置时进行选择。作者还明确指出了这一点:这个变量[CMAKE_BUILD_TYPE]只支持基于make的生成器。它根本不是真的。Cmake对于默认行为中可以更改的内容非常灵活。@ixSci您的解决方案不会更改默认设置,它会完全删除除版本之外的任何配置。我认为这对这种问题来说有点苛刻。我也不同意-1(并不意味着是你),因为我答案的中心论点仍然有效:关于活动配置的信息不是由CMake生成的项目文件的一部分,而是由VS.I频繁切换构建类型生成的.suo文件的一部分。我看不出只有一种类型是多么方便——你正在删除有用的功能。这是OP的问题IMHO的正确答案。我认为这将是一种非常意外的方式来为那些使用VisualStudio的人设置构建类型。虽然它确实有效,但我肯定不会推荐这种方法。@Fraser,有什么论据吗?我的主要论据是这是一种不同寻常的技术。如果在一个私人项目中使用它,除了作者之外没有人需要运行CMake,那么它就很酷了。如果我不得不使用它,那么一开始只有一种构建类型会让人感到惊讶。一旦我看到了原因,它会变得有点烦人,因为你实际上并没有试图禁用其他构建类型;你只是强迫多个配置用户必须像单个配置用户一样工作。我不认为这是正常的-这是一个观察到了许多其他项目的工作方式。我可以指出几个没有这样做的项目。我不知道有哪一个是这样的。对我来说,在IDE中单击两次来更改构建类型要比打开命令提示符、导航到我的构建根目录、然后键入
cmake容易得多-DCMAKE\u BUILD\u TYPE=Release
。两者都不难,但我每次都会选择更简单的方式。别忘了你在这里依赖的是未记录的行为。CMake只保证CMake_BUILD_类型做正确的事情。您的解决方案可能会突然停止使用任何未来的CMake版本
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
SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "" FORCE)
cmake -DCMAKE_BUILD_TYPE=Release .. 
cmake --build . --config Release