2

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并添加了Nfor -DNDEBUG-DNREETRANT-DNTHREAD_SAFE,并将优化设置为 2 级。

我说的对NNO DEBUG

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

4

2 回答 2

4

以下是基于您的 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在你的代码中添加一样,这是没有意义的。
于 2013-03-12T08:50:18.480 回答
1
  • -D_DEBUG如果您也可以检查是否缺少,您需要什么NDEBUG?(当然,除非您想要单独控制assert和其他调试#ifdef。我从来没有这种需要。)

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

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

您可能还需要注意:

  • CMake 会自动设置类似的东西-g -O0-O2因此添加所需的警告和附加标志就足够了。

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

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

于 2013-03-12T08:38:53.313 回答