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
?
这是我需要做的就是区分调试和发布构建吗?
答案 0 :(得分:4)
以下是基于您的CMake标志的一些建议:
-g -O0
和发布模式-O2 -g
。如果代码大小不重要,最好在O2释放模式下添加-g
标志。使用-g
,包含代码的一些符号信息,它只会将整个二进制文件大小增加大约10%~20%,但是用户可以帮助您进行堆栈转储,这可以帮助调试。 / LI>
-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
可执行文件。 (就个人而言,我努力不必让我的客户提取验尸堆/核心转储。;-))