首页 > 解决方案 > 使用 CMake 时在 Visual Studio 中检测构建类型(调试/发布)

问题描述

我有一个小游戏引擎,当它在调试或发布模式下构建时,我需要在其中定义一些自定义宏。

这是我的 CMake 脚本中的几行,它们应该可以做到这一点:

if (CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(OE_BUILD_TYPE_DEFINE "OE_DEBUG")
endif()
    
if (CMAKE_BUILD_TYPE STREQUAL "Release")
    set(OE_BUILD_TYPE_DEFINE "OE_RELEASE")
endif()

if (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
    set(OE_BUILD_TYPE_DEFINE "OE_DEBUG")
endif()

if (CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
    set(OE_BUILD_TYPE_DEFINE "OE_RELEASE")
endif()

target_compile_definitions(OverEngine PRIVATE
    "_CRT_SECURE_NO_WARNINGS"
    "GLFW_INCLUDE_NONE"

    PUBLIC
    OE_BUILD_TYPE_DEFINE
)

它在使用makeninja在 Linux 中运行良好,但在使用 VisualStudio 的 Windows 上,该CMAKE_BUILD_TYPE变量始终为空。我知道原因。这是因为 VS 可以在不重新运行 CMakemakeninja生成器的情况下切换构建类型。

Premake 有一个叫做的东西filter,它工作得很好,但由于其他原因,我现在没有使用它。

我该如何设置?

如果需要,我正在使用 VisualStudio 2019 16.7.2 和 CMake 3.18.2。

编辑:通过用这些行替换这些行来修复:

target_compile_definitions(OverEngine PRIVATE
    "_CRT_SECURE_NO_WARNINGS"
    "GLFW_INCLUDE_NONE"

    PUBLIC
    $<$<CONFIG:Debug>:OE_DEBUG>
    $<$<CONFIG:Release>:OE_RELEASE>

    $<$<CONFIG:RelWithDebInfo>:OE_DEBUG>
    $<$<CONFIG:MinSizeRel>:OE_RELEASE>
)

标签: visual-studiovisual-c++cmakec++17visual-studio-2019

解决方案


您可能想在此处使用生成器表达式。它们在构建时进行评估,因此即使对于 Visual Studio 或 Xcode 等多配置生成器,也会设置构建类型。

target_compile_definitions(OverEngine
    PRIVATE
      _CRT_SECURE_NO_WARNINGS
      GLFW_INCLUDE_NONE
    PUBLIC
      $<$<CONFIG:Debug>:OE_DEBUG>
      $<$<CONFIG:RelWithDebInfo>:OE_DEBUG>
      $<$<CONFIG:Release>:OE_RELEASE>
      $<$<CONFIG:MinSizeRel>:OE_RELEASE>
)

推荐阅读