ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我正在使用的 CMake 命令是:

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

如果有请提供解决方案。

尝试使用 cmake -DCMAKE_BUILD_TYPE=Release -H"soruce_path" -B"Buidl path" -G"Visual Studio 10"
它给出了相同的结果。它仅在调试模式下构建项目。
CMAKE_CONFIGURATION_TYPES 指定可用的构建类型。这指定了可用的构建类型,例如 Debug、Release、RelWithDebInfo 等。这在大多数平台上都有合理的默认值。但可以扩展以提供其他构建类型。另请参阅 CMAKE_BUILD_TYPE。
CMAKE_BUILD_TYPE 指定基于 make 的生成器的构建类型。这指定了将在此树中构建的构建类型。可能的值为空、Debug、Release、RelWithDebInfo 和 MinSizeRel。此变量仅支持基于 make 的生成器。如果支持此变量,则 CMake 还将为名为 CMAKE_C_FLAGS_[Debug|Release|RelWithDebInfo|MinSizeRel] 的变量提供初始值。例如,如果 CMAKE_BUILD_TYPE 是 Debug,那么 CMAKE_C_FLAGS_DEBUG 将被添加到 CMAKE_C_FLAGS。
如果它们中的任何一个都有效,您可以使用这两个选项

e
emlai

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

cmake --build {DIR} --config Release

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


您没有更改配置构建类型,您正在构建项目的发布配置。虽然答案是对的,+1
CMAKE_CONFIGURATION_TYPES doesn't work either CMAKE_CONFIGURATION_TYPES 变量控件为当前项目构建配置(查看 Visual Studio 项目的 solution configurations)。请参阅上面的评论。
这对我有用。此外,当我想要进行安装时,我会执行 cmake --build . --config Release --target install。然后 cmake 工作它很神奇!
@PfunnyGuy 非常有帮助,但我想知道为什么 cmake --install . 与 VS 生成器的工作方式不同。
M
Maks

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

简短的回答

Link

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” - 指定源文件夹的路径


--config Release 对我不起作用。只有 -DCMAKE_CONFIGURATION_TYPES=Release 有效。
ALL_BUILD 影响依赖于项目的所有目标。我宁愿不碰它。如果您正在处理您的项目但想在发布模式下构建其依赖项怎么办?这是一个完美的发现和常见的例子。
S
Smi

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

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

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


那么CMAKE_BUILD_TYPE有什么用。
@123r789 例如,它用于 Makefile 生成器,当时只允许一个配置文件。像 VS 这样的 IDE 生成器一次生成多个配置文件,并允许从 IDE 中选择一个。使用 Makefile,您只有一个配置文件,因此必须在 CMake 配置时做出选择。 documentation 还明确指出了这一点:此变量 [CMAKE_BUILD_TYPE] 仅支持基于 make 的生成器。
这根本不是真的。 Cmake 对于可以在默认行为中更改的内容非常灵活。
@ixSci 您的解决方案不会更改默认设置,它会完全删除版本之外的任何配置。我认为这对于这类问题来说有点苛刻。我也不同意 -1(并不暗示是你),因为我的回答的中心论点仍然有效:有关活动配置的信息不是 CMake 生成的项目文件的一部分,而是 .suo 文件的一部分由 VS 生成。
我经常切换构建类型。我也看不出只有一种类型有多方便——你正在删除有用的功能。这是对 OP 问题恕我直言的正确答案。
L
Louis Langholtz

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

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

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

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

cmake -DCMAKE_BUILD_TYPE=Release .. 

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

cmake --build . --config Release

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


a
aalpatya

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

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose Release or Debug" FORCE)
endif()

i
ixSci

照常使用它,但在根 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.

我认为这将是一种非常出乎意料的方式来为那些习惯于 Visual Studio 的人设置构建类型。虽然它确实有效,但我当然不会推荐这种方法。
@Fraser,有什么论据吗?
我的主要论点是这是一种不寻常的技术。如果它用在一个私人项目中,除了作者之外没有人需要运行 CMake,那么很酷。如果我不得不使用它,最初只有一种构建类型会令人惊讶。一旦我看到原因,它会变得有点烦人,因为您实际上并没有尝试禁用其他构建类型;你只是强迫多配置用户必须像单配置用户一样工作。
我没有决定这很正常 - 这是一个观察到许多其他项目的工作方式的观察。我可以指出几个不这样做的项目。我不知道有一个可以做到。对我来说,在我的 IDE 中单击 2 次来更改构建类型要比打开命令提示符、导航到我的构建根目录然后键入 cmake . -DCMAKE_BUILD_TYPE=Release 要容易得多。两者都不难,但我每次都会选择更简单的方法。
我们不要忘记您在这里依赖于无证行为。 CMake 只保证 CMAKE_BUILD_TYPE 做正确的事for make based generators。您的解决方案可能会突然停止使用任何未来的 CMake 版本。