编程 MD(d)、MT(d)编译选项的区别 1.各个选项代表的含义编译选项包含静态链接的lib说明/MD_MT、_DLLMSVCRT.lib多线程、Release、DLL版本的运行时库 ---只能用于Release版本/MDd_DEBUG、_MT、_DLLMSVCRTD.lib多线程、Debug、DLL版本的运行时库 ----只能用于Debug版本/MT_MTLIBCMT.lib多线程、Release版本的运行时库/MTd_DEBUG、_MTLIBCMTD.lib多线程、Debug版本的运行时库简单的说1/MD表示运行时库由操作系统提供一个DLL程序里不集成。2/MT表示运行时库由程序集成,程序不再需要操作系统提供运行时库DLL。/MT是multithread, static version 意思是多线程静态的版本定义了它后编译器把LIBCMT.lib安置到OBJ文件中让链接器使用LIBCMT.lib 处理外部符号。/MD是multithread- and DLL-specific version意思是多线程DLL版本定义了它后编译器把MSVCRT.lib安置到OBJ文件中它连接到DLL的方式是静态链接实际上工作的库是MSVCR80.DLL。即静态运行时库LIBCMT.lib动态运行时库MSVCRT.lib MSVCR80.DLL2./MD、/MT的选择1、为什么选择/MD不选/MT1程序就不需要静态链接运行时库可以减小软件的大小2所有的模块都采用/MD使用的是同一个堆不存在A堆申请B堆释放的问题。2、为什么选择/MT不选择/MD1有些系统可能没有程序所需要版本的运行时库程序必须把运行时库静态链接上。3、多个模块必须选择相同类型的运行时库不要混合使用。3.选择/MT需要解决的堆空间释放问题不同的模块各自有一份C运行时库代码各个C运行库会有各自的堆导致了各个模块会有各自的堆。如果在A堆中申请空间到B堆中释放就会有崩溃在模块A申请的空间必须在模块A中释放。附件下载地址http://files.cnblogs.com/cswuyg/Test_MD_and_MT.rar的DLL以及DLLUser代码以STL的string为例通过修改编译选项验证了这个问题。(string在赋值的时候需要释放掉原来的空间然后再申请新的空间存储新的内容。)