使用 CMake 时检测 Visual Studio 中的构建类型(调试/发布)

2024-01-12

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

以下是我的 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
)

使用起来效果很好make or ninja在 Linux 中,但是在使用 VisualStudio 的 Windows 中,CMAKE_BUILD_TYPE变量始终为空。我知道原因。这是因为 VS 可以切换构建类型而无需重新运行 CMake,这与make or ninja发电机。

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>
)

您可能想使用生成器表达式 https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html?highlight=generator%20expression#variable-queries这里。它们在构建时进行评估,因此即使对于 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>
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CMake 时检测 Visual Studio 中的构建类型(调试/发布) 的相关文章

随机推荐

  • Android Studio:ButterKnife 6.1.0 重复类:$$View 注入器

    由于遇到 65K 方法问题 我将项目从 Eclipse 迁移到 AS 在解决了我最初在 AS 中遇到的每个依赖问题后 我陷入了这个问题 无论我从博客和 SO 本身的其他类似帖子中尝试什么 这个问题似乎都不会消失 我检查了启用注释处理在注释处
  • 同一列中具有不同格式的 Pandas 日期时间

    我有一个 pandas 数据框 其中有两种不同格式的日期时间 例如 3 14 2019 5 15 32 AM 2019 08 03 05 15 35 2019 01 03 05 15 33 2019 01 03 05 15 33 2 28
  • 如何删除数据库中的所有表而不删除数据库本身?

    我想从数据库中删除所有表 但不删除数据库本身 是否可以 我只是在寻找比删除数据库并再次创建它更短的方法 谢谢 最短的是重新创建数据库 但如果你不想 这是针对 MySQL PHP 的 没有测试过 但类似的东西 mysqli new mysql
  • 简单的 Clojure XML 编辑

    假设我有一个地图向量 username kbee firstname Kay lastname Bee username jcee firstname Jay lastname Cee 我想为每个地图生成 xml 文件 如下所示
  • mvn部署不加载S3凭证

    我正在将 Gradle 项目转换为 Maven 我正在做的事情之一是将 Jar 部署到 S3 我已经像这样配置了发行版
  • VBScript 中的 MsgBox "" 与 MsgBox()

    我正在尝试编写 VBScript 并使用 Randomize 和 MsgBox 等函数 我很好奇使用 和不使用它们有什么区别 例如 Randomize 这条线有效 Randomize 这条线也有效 MsgBox Hello World 这有
  • 如何从键盘的容器应用程序检测自定义键盘是否已激活?

    我想知道是否有一种方法可以让我检测从键盘容器应用程序是否已在设备的 设置 应用程序中激活关联的键盘 例如 我有兴趣在容器应用程序中添加一个简单的 步骤 功能 其中步骤 1 是 激活键盘 步骤 2 取决于步骤 1 的完成 因此 我有兴趣弄清楚
  • 如何确定 git pull 将下载多少数据?

    假设我通过热点使用手机昂贵的数据套餐 并且按 MB 付费 有没有办法检查如果我发出的话 git 需要下载多少数据git pull 明显没有下载 最简洁的答案是不 长的答案是 也许 但你需要某种辅助系统 注意git pull只是git fet
  • 使用 maven- assembly-plugin 创建两个可执行的 jar

    我有一个 Maven 项目 我想从中创建两个可执行的 jar 文件 一个将由用户交互使用 第二个将作为计划作业运行 读取前者生成的日志文件 最后 我希望这两个 jar 文件除了 MANIFEST MF 文件中的 Main Class 属性之
  • Objective-C/iPhone 开发中的延迟实例化

    简单的问题 我知道 Objective C 中所有属性都以 nil 开头 并且向 nil 发送消息不会执行任何操作 因此您必须使用 Class alloc init 进行初始化 在向新创建的属性发送消息之前 但是 如果我不向此属性发送消息或
  • Django JSON 字段。 “模块”对象没有属性“JSONField”

    我正在学习 Django 并因在模型中创建 json 字段而感到沮丧 我试图在模型中创建一个 json 字段 但出现错误 模块 对象没有属性 JSONField 这是我在 models py 中的类 class Question model
  • 使用 Azure Function v2 自定义 Application Insight TelemetryInitializer

    在 Azure 函数中 我们使用 NET HttpClient 类 Azure Servicebus SDK 和 Azure 存储 SDK 发出多个请求 所有内容都通过 Application Insight 日志记录中的构建完美记录 显示
  • 在 Internet Explorer 中是否有理由用 Script 替换 JavaScript?

    那么 当 JScript 与 JavaScript 不同时 IE 如何解释 jQuery 以及所有其他 JavaScript 将 IE 的 JavaScript 替换为 JScript 是否更好 是否存在性能差异 JScript 和 Jav
  • 正则表达式匹配后面没有任何内容的字符串

    我试图找出一个正则表达式序列 该序列将匹配下面列表中的第一项 但不匹配其他两项 Some Folder 是可变的 http www url com Some Folder http www url com Some Folder thing
  • R Shiny:修改选择后保留无功输入值

    我试图在用户修改另一个中的选择后将用户选择的值保留在动态生成的 selectInput 中selectInput multiple T 选项 每当我修改我的选择时 所有动态生成的值都会重置 例如 我首先从 Letters selectInp
  • 如何从 CursorAdapter 重写 getItemId(int pos) 方法?

    由于此处的另一个答案 我收到了这个问题 但没有解释如何执行我所要求的操作使用自定义适配器时如何获取 onItemClick ListView 中行的 id https stackoverflow com questions 4826683
  • 如何通过双击关闭 DateTimePicker

    我正在使用 jQuery DateTimePicker 插件 作者 特伦特 理查森 http trentrichardson com 并且只有在您选择日期和时间后才会关闭 然而 有些用户并不关心时间 他们希望日历在仅选择日期后关闭 我仅在选
  • React 的新上下文 api 与酶

    我一直在使用酶并且非常喜欢它 它适用于 React 16 直到我想测试使用 React 新上下文 api 的新项目 如果我仅使用浅层渲染我的基本组件并使用控制台记录组件的调试 我可以看到其内容 但是当我将新的上下文 api 与提供者和消费者
  • 接收 Websphere MQ 消息时如何执行显式 ACK?

    我有一个应用程序正在侦听 IBM Websphere MQ 队列上的消息 一旦消息被使用 应用程序就会执行一些处理逻辑 如果处理完成正常 我希望应用程序确认该消息并将其从队列中删除 如果处理时发生错误 我希望该消息保留在队列中 这是如何实施
  • 使用 CMake 时检测 Visual Studio 中的构建类型(调试/发布)

    我有一个小游戏引擎 在调试或发布模式下构建时需要定义一些自定义宏 以下是我的 CMake 脚本的几行 应该可以做到这一点 if CMAKE BUILD TYPE STREQUAL Debug set OE BUILD TYPE DEFINE