设置调试和释放模式时的编译器标志

时间:2013-03-12 08:31:59

标签: c build

gcc(GCC)4.7.2     cmake版本2.8.10.2     C89

我正在使用cmake作为我的构建系统。我想相应地设置标志以进行调试或释放。

使用debug编译

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

我说N表示NO DEBUG

是对的

这是我需要做的就是区分调试和发布构建吗?

2 个答案:

答案 0 :(得分:4)

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

  1. 调试模式-g -O0和发布模式-O2 -g。如果代码大小不重要,最好在O2释放模式下添加-g标志。使用-g,包含代码的一些符号信息,它只会将整个二进制文件大小增加大约10%~20%,但是用户可以帮助您进行堆栈转储,这可以帮助调试。 / LI>
  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一样,这是毫无意义的。

答案 1 :(得分:1)

  • 如果您还可以检查-D_DEBUG缺席,您还需要NDEBUG? (当然,除非你想要单独控制assert和其他调试#ifdef。我从来没有这种需要。)

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

最重要的是,您想要的Debug和Release代码之间的区别完全取决于您。我希望我的调试代码包含覆盖率信息,我的发布代码为-O3。你的里程明显不同。这两种方式都不是“正确”或“错误”。

您可能还需要注意:

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

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

  • 正如Ling Kun所说,你甚至可以在发布代码中保留-g。至少在开发期间它很有用,您可以在安装期间命令CMake到strip可执行文件。 (就个人而言,我努力不必让我的客户提取验尸堆/核心转储。;-))