【问题标题】:How to add a symbol to cmake, in debug mode only?如何仅在调试模式下向 cmake 添加符号?
【发布时间】:2022-01-17 16:48:42
【问题描述】:

我希望以下代码仅在调试模式下编译

main.cpp

    #ifdef __DEBUG__
        int a=1;
        std::cout<<a;
    #endif

在 cmake 中添加以下内容

add_compile_options(
  "-D__DEBUG__"
)

add_compile_options(
  "$<$<CONFIG:DEBUG>:-D__DEBUG__>"
)

似乎什么也没做。

我怎样才能实现期望的行为?

【问题讨论】:

  • 你重建了makefile吗?
  • 预定义的调试配置被命名为Debug 那么add_compile_options( "$&lt;$&lt;CONFIG:Debug&gt;:-D__DEBUG__&gt;") 工作吗?还有一个add_compile_definitions 命令可以在没有-D 前缀的情况下使用:add_compile_definitions($&lt;$&lt;CONFIG:Debug&gt;:__DEBUG__&gt;)
  • add_compile_definitions($&lt;$&lt;CONFIG:Debug&gt;:__DEBUG__&gt;)#if defined(__DEBUG__) 结合使用。谢谢:)
  • 不要在 CMake 中使用和推荐目录命令!!它们会带你走上绝对疯狂的道路。使用target_compile_definitions 而不是add_compile_definitions

标签: c++ debugging gcc cmake


【解决方案1】:

尝试设置 CMAKE_CXX_FLAGS

set(CMAKE_CXX_FLAGS "-D__DEBUG__")

在源代码中

#if defined(__DEBUG__)
 int a=1;
 std::cout<<a;
#endif

【讨论】:

  • 那不会专门为调试配置添加这个。
【解决方案2】:

选项 1:NDEBUG

CMake 已经在发布构建期间定义了NDEBUG,只需使用它:

    #ifndef NDEBUG
        int a=1;
        std::cout<<a;
    #endif

选项 2:target_compile_definitions

配置拼写为Debug,而不是DEBUG。由于您应该永远、永远使用目录级命令(如add_compile_options),我将向您展示如何使用目标级命令:

target_compile_definitions(
  myTarget PRIVATE "$<$<CONFIG:Debug>:__DEBUG__>"
)

也没有必要使用过于通用的编译 options 命令。 CMake 已经提供了一个抽象来确保预处理器定义可用。

【讨论】:

  • 1.双重否定对我来说真的没有什么意义,但很高兴知道它存在。 2.“你永远不应该使用......” - 为什么?
  • @Gulzar (1), NDEBUG 是 C 定义的用于禁用 assert() 宏的标准符号,因此以这种方式使用并不奇怪。 (2) CMake 中的目录级命令具有高度混乱和非本地行为。例如,它们适用于同一目录中的 所有 目标(即使是在调用之前定义的目标)以及在调用 之后 包含的子目录中的目标,但不适用于子目录包括之前调用。它们是 2.x 时代的遗物,应该被遗忘。
  • 这里直接引用了 CMake 维护者之一 Craig Scott 所著的《Professional CMake》一书:“读者应该期望在网上和其他地方遇到大量仍然推荐模式和方法的示例和教程使用较旧的方法,使用变量和目录属性命令。应该理解,target_…() 命令应该是 CMake 3.0+ 时代的首选方法。"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多