Debug 与 Release 版本的区别
Debug 和Release 并没有本质的区别,他们只是 VC 预定义提供的两组编译选项的集合,编译器只是按照预定的选
项行动。如果我们愿意,我们完全可以把 Debug 和 Release 的行为完全颠倒过来。当然也可以提供其他的模式,例如
自己定义一组编译选项,然后命名为 MY_ABC 等。习惯上,我们仍然更愿意使用 VC 已经定义好的名称。
Debug 版本包括调试信息,所以要比 Release 版本大很多(可能大数百 K 至数 M)。至于是否需要 DLL 支持,主要
看你采用的编译选项。如果是基于ATL 的,则 Debug 和 Release 版本对 DLL 的要求差不多。如果采用的编译选项为
使用 MFC 动态库,则需要 MFC42D.DLL 等库支持,而Release 版本需要 MFC42.DLL 支持。Release 不对源代码进行
调试,不考虑 MFC 的诊断宏,使用的是MFC Release 库,编译时对应用程序的速度进行优化,而 Debug 则正好相反,
它允许对源代码进行调试,可以定义和使用 MFC 的诊断宏,采用 MFC Debug 库,对速度没有优化。
既然 Debug 和Release 仅仅是编译选项的不同,那么为什么要区分 Debug 和 Release 版本呢?
Debug 和 Release,在我看来主要是针对其面向的目标不同的而进行区分的。Debug 通常称为调试版本,通过一系
列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供强大的应用程序调试能力。
而 Release 通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信息,同
时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。
下面仅就默认的 Debug 和 Release 版本的选项进行比较,详细的编译选项可以看 MSDN 的说明。
我们将默认的 Debug 和 Release 的选项设置进行比较,过滤掉相同设置,主要的不同如下:
编译选项:/Od /D "_DEBUG" /Gm /RTC1 /MDd /Fo"Debug““" /ZI
链接选项:/OUT:"D:“MyProject“logging“Debug“OptionTest.dll" /INCREMENTAL
Release 设置:
编译选项:/O2 /GL /D "NDEBUG" /FD /MD /Fo"Release““" /Zi
链接选项:/OUT:"D:“MyProject“logging“Release“OptionTest.dll" /INCREMENTAL:NO
Debug 版本:
/MDd /MLd 或/MTd 使用Debug runtime library(调试版本的运行时刻函数库)
/Od 关闭优化开关
/D "_DEBUG" 相当于#define _DEBUG,打开编译调试代码开关(主要针对 assert 函数)
/ZI 创建Edit and continue 数据库,在调试过程中如果修改了源代码不需重新编译
/GZ 可以帮助捕获内存错误
/Gm 打开最小化重链接开关,减少链接时间
Release 版本:
/MD /ML 或/MT 使用发布版本的运行时刻函数库
/O1 或/O2 优化开关,使程序最小或最快
/D "NDEBUG" 关闭条件编译调试代码开关(即不编译 assert 函数)
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改
MDd 与 MD
首先,Debug 版本使用调试版本的运行时库(/MDd 选项),Relase 版本则使用的是发布版本的运行时库
(vcrt.dll)。其区别主要在于运行时的性能影响。调试版本的运行时库包含了调试信息,并采用了一些保护机制以帮
助发现错误,也因此,其性能不如发布版本。编译器提供的 Runtime Library 很稳定,不会造成 Release 版本错误,倒
是由于 Debug 版本的 Runtime Library 加强了对错误的检测,如堆内存分配检查等,反而会报告错误,应当指出,如果