【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的区别/