【问题标题】:Compiler flags when setting debug and release mode设置调试和发布模式时的编译器标志
【发布时间】:2013-03-12 08:31:59
【问题描述】:

gcc (GCC) 4.7.2 cmake 版本 2.8.10.2 c89

我使用 cmake 作为我的构建系统。我想相应地设置标志来调试或发布。

调试编译

  SET(CMAKE_C_FLAGS_DEBUG "-Wall -Wextra -Wunreachable-code -g -m32 -D_DEBUG -O0 -D_LARGEFILE64_SOURCE -D_REETRANT -D_THREAD_SAFE")

编译发布

  SET(CMAKE_C_FLAGS_RELEASE "-Wall -Wextra -Wunreachable-code -m32 -DNDEBUG -O2 -D_LARGEFILE64_SOURCE -D_REETRANT -D_THREAD_SAFE")

对于调试,我已包含标志 -g 并将优化设置为级别 0。

对于该版本,我删除了标志 -g,并为 -DNDEBUG-DNREETRANT-DNTHREAD_SAFE 添加了 N,并将优化设置为 2 级。

我说得对,N 的意思是 NO DEBUG

这就是我需要做的所有事情来区分调试和发布版本吗?

【问题讨论】:

  • 定义 DEBUGNDEBUG 分别用于调试和发布编译。但是,您不希望发布版本也是可重入和线程安全的吗?然后不要更改这些定义。
  • 为什么要在发布模式下设置 -DNREENTRANT 和 -DNTHREAD_SAFE?你不是在发布模式下在多线程环境下运行你的代码吗?
  • NDEBUG 是一个预处理器符号,用于控制 assert 是否处于活动状态,如 C 标准所指定。 _DEBUG 的状态不同。
  • @Jay,我已经为这些更改编辑了我的源代码。那是我的错误。

标签: c build


【解决方案1】:

以下是基于您的 CMake 标志的一些建议:

  1. 调试模式-g -O0,和发布模式-O2 -g。如果代码大小不重要,最好添加 -g 标志,即使是 O2 释放模式。使用-g,包含了代码的一些符号信息,它只增加了整个二进制大小大约10%~20%,但是用户可以帮助你给你一个堆栈转储,这对调试很有帮助。
  2. 使用-UDEBUG -UREETRANT 而不是-DNDEBUG -DNREETRANT-DMACRO 标志就像在你的代码中添加#define MACOR,如果你有像#ifdef MACRO SOME_DEBUG_CODE #endif 这样的代码区域,预处理器会将代码保留在那里,而-UDEBUG 标志就像#undefine MACRO,并且预处理器将删除SOME_DEBUG_CODE。如果只是添加-DNDEBUG -DNREETRANT,就像在代码中添加#define NDEBUG #defin NREETRANT一样,没有意义。

【讨论】:

  • Re -g:为您的发布版本保留它,但在发送它之前在您的二进制文件上使用strip 以节省大小(并获得一点晦涩)。您仍然可以使用未剥离的二进制文件(您存储的)解释堆栈跟踪或核心转储。
【解决方案2】:
  • 如果您还可以检查NDEBUG缺席,您需要-D_DEBUG 做什么? (当然,除非你想单独控制 assert 和其他调试 #ifdef 的。我从来没有这种需要。)

  • 为什么需要不同的重入和线程安全设置?

归根结底,调试代码和发布代码之间的不同之处完全取决于您。我希望我的调试代码包含覆盖信息,我的发布代码为-O3。您的里程显然会有所不同。这两种方式都不是“正确”或“错误”。

您可能还需要注意:

  • CMake 会自动设置 -g -O0-O2 之类的内容,因此添加所需的警告和其他标志就足够了。

  • 在设置编译器标志之前,您可能需要关注可移植性并检查 if ( CMAKE_COMPILER_IS_GNUC )(或 C++ 的 ..._GNUCC)。

  • 正如凌坤所说,即使在Release代码中也可以保留-g。至少在开发过程中它是有用的,并且您可以在安装过程中将 CMake 命令到 strip 可执行文件。 (就个人而言,我力求不必让我的客户提取事后堆栈/核心转储。;-))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多