【Visual Studio】MD与MT的区别及运行库类型选择
概述:MD 与 MT 标志说明及运行库类型选择
[toc]
本篇主要总结一下自己在项目开发过程中经常遇到的一个问题,即Visual Studio编译过程中如何选择运行库的类型。希望对其它开发的伙伴们有一定的参考价值和帮助。
1.在Visual Studio中设置
在Visual Studio 2019中,右键项目名称,打开项目属性页,选择“配置属性”->“C/C++”->“代码生成”->“运行库”即可对运行库类型进行设置,如下图所示。

这里运行库类型主要包含四种:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试(/MDd)。其中带有d的类型是项目的调试版本,不带有d的类型是项目的Release版本。
2. MT与MD的区别
- **
/MT:**是multithread-static version,是多线程静态版本的意思,项目会使用运行时库的多线程静态版本,编译器会将LIBCMT.lib放入.obj文件中,以便链接器使用LIBCMT.lib解析外部符号; - **
/MTd:**是定义了_DEBUG和/MT,是/MT类型的debug版本; - **
/MD:**是multithread-dll version,是多线程dll版本的意思,项目会使用运行时库的多线程动态dll版本,编译器会将MSVCRT.lib放入.obj文件中,在编译项目时,它会静态链接MSVCRT.lib,但在实际运行过程中,它会链接使用MSVCR90.dll; - **
MDd:**是定义了_DEBUG和/MD,是/MD类型的debug版本;
因此,我们在编译时,对应的库一定要配套一致。比如你用CMake生成工程文件时,若CMake是用/MT类型生成的,则它所调用的运行时库为LIBCMT.lib;后面生成工程时,你必须也选择/MT类型,否则你选择/MD类型的话,工程在链接时会调用MSVCRT.lib和MSVCR90.dll,显然两次调用不同的运行时库,会出现重定义的错误。
总起来说,/MD类型表示运行时库不集成,生成的文件小,程序运行时动态加载对应的dll;/MT类型表示运行时库集成,生成的文件较大,在链接时将C/C++运行时库集成到程序中。
3. 使用
在使用过程中,如果Release模式下使用MD编译的文件报错缺少 MSVCD140。dll,则可以使用 MT 选项编译,解决缺少动态库的问题。
【Visual Studio】MD与MT的区别及运行库类型选择
https://hodlyounger.github.io/2023/10/27/A_OS/Windows/Visual Studio/【Visual Studio】MD与MT的区别/