原文查看 

Windows编程vs编译器 MD(d)、MT(d)编译选项的区别

1、编译选项的位置

以VS2005为例,这样子打开:


1)         打开项目的Property Pages对话框


2)         点击左侧C/C++节


3)         点击Code Generation节


4)         右侧第六行Runtime Library项目


2、各个设置选项代表的含义

编译选项


包含


静态链接的lib


说明


/MD


_MT、_DLL


MSVCRT.lib


多线程、Release、DLL版本的运行时库  —只能用于Release版本


/MDd


_DEBUG、_MT、_DLL


MSVCRTD.lib


多线程、Debug、DLL版本的运行时库  —-只能用于Debug版本


/MT


_MT


LIBCMT.lib


多线程、Release版本的运行时库


/MTd


_DEBUG、_MT


LIBCMTD.lib


多线程、Debug版本的运行时库


 


简单的说:


(1)/MD,表示运行时库由操作系统提供一个DLL,程序里不集成。


(2)/MT,表示运行时库由程序集成,程序不再需要操作系统提供运行时库DLL。


 


二、/MD、/MT的选择

      1、为什么选择/MD,不选/MT?

         (1)程序就不需要静态链接运行时库,可以减小软件的大小;


         (2)所有的模块都采用/MD,使用的是同一个堆,不存在A堆申请,B堆释放的问题。


      2、为什么选择/MT,不选择/MD?

         (1)有些系统可能没有程序所需要版本的运行时库,程序必须把运行时库静态链接上。


      3、多个模块,必须选择相同类型的运行时库,不要混合使用。

 


 


三、选择/MT需要解决的堆空间释放问题

         不同的模块各自有一份C运行时库代码,各个C运行库会有各自的堆,导致了各个模块会有各自的堆。如果在A堆中申请空间,到B堆中释放就会有崩溃,在模块A申请的空间,必须在模块A中释放。


         附件(下载地址:http://files.cnblogs.com/cswuyg/Test_MD_and_MT.rar)的DLL以及DLLUser代码,以STL的string为例,通过修改编译选项验证了这个问题。(string在赋值的时候需要释放掉原来的空间,然后再申请新的空间存储新的内容。)