Reusable Library Switch Library Macro(s) Defined
----------------------------------------------------------------
Single Threaded /ML LIBC (none)
Static MultiThread /MT LIBCMT _MT
Dynamic Link (DLL) /MD MSVCRT _MT and _DLL
Debug Single Threaded /MLd LIBCD _DEBUG
Debug Static MultiThread /MTd LIBCMTD _DEBUG and _MT
Debug Dynamic Link (DLL) /MDd MSVCRTD _DEBUG, _MT, and _DLL
其中以小写 “d” 结尾的选项表示的 DEBUG 版本的,没有 “d” 的为 RELEASE 版本。大型项目中必须要求所有组件和第三方库的运行时库是统一的,否则将会出现LNK2005井喷。
单线程运行时库选项 /ML 和 /MLd 在 VS2003 以后就被废了。
/MT 和 /MTd 表示采用多线程 CRT 库的静态 lib 版本。该选项会在编译时将运行时库以静态 lib 的形式完全嵌入。该选项生成的可执行文件运行时不需要运行时库dll的参加,会获得轻微的性能提升,但最终生成的二进制代码因链入庞大的运行时库实现而变得非常臃肿。当某项目以静态链接库的形式嵌入到多个项目,则可能造成运行时库的内存管理有多份,最终将导致致命的 “Invalid Address specified to RtlValidateHeap” 问题。另外托管 C++ 和CLI 中不再支持 /MT 和 /MTd 选项。
/MD 和 /MDd 表示采用多线程 CRT 库的动态 dll 版本,会使应用程序使用运行时库特定版本的多线程 DLL。链接时将按照传统 VC 链接 dll 的方式将运行时库 MSVCRxx.DLL 的导入库 MSVCRT.lib 链接,在运行时要求安装了相应版本的 VC 运行时库可再发行组件包(当然把这些运行时库dll放在应用程序目录下也是可以的)。 因 /MD 和 /MDd 方式不会将运行时库链接到可执行文件内部,可有效减少可执行文件尺寸。当多项目以 MD 方式运作时,其内部会采用同一个堆,内存管理将被简化,跨模块内存管理问题也能得到缓解。
结论:/MD 和 /MDd 将是潮流所趋,/ML 和 /MLd 方式请及时放弃,/MT 和 /MTd 在非必要时最好也不要采用了。
参考:
0. 原文