[toc]

本篇主要总结一下自己在项目开发过程中经常遇到的一个问题,即Visual Studio编译过程中如何选择运行库的类型。希望对其它开发的伙伴们有一定的参考价值和帮助。

1.在Visual Studio中设置

Visual Studio 2019中,右键项目名称,打开项目属性页,选择“配置属性”->“C/C++”->“代码生成”->“运行库”即可对运行库类型进行设置,如下图所示。

这里运行库类型主要包含四种:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试(/MDd)。其中带有d的类型是项目的调试版本,不带有d的类型是项目的Release版本。

2. MTMD的区别

  • /MTmultithread-static version,是多线程静态版本的意思,项目会使用运行时库的多线程静态版本,编译器会将LIBCMT.lib放入.obj文件中,以便链接器使用LIBCMT.lib解析外部符号;
  • /MTd是定义了_DEBUG/MT,是/MT类型的debug版本;
  • /MDmultithread-dll version,是多线程dll版本的意思,项目会使用运行时库的多线程动态dll版本,编译器会将MSVCRT.lib放入.obj文件中,在编译项目时,它会静态链接MSVCRT.lib,但在实际运行过程中,它会链接使用MSVCR90.dll
  • MDd是定义了_DEBUG/MD,是/MD类型的debug版本;

因此,我们在编译时,对应的库一定要配套一致。比如你用CMake生成工程文件时,若CMake是用/MT类型生成的,则它所调用的运行时库为LIBCMT.lib;后面生成工程时,你必须也选择/MT类型,否则你选择/MD类型的话,工程在链接时会调用MSVCRT.libMSVCR90.dll,显然两次调用不同的运行时库,会出现重定义的错误。

总起来说,/MD类型表示运行时库不集成,生成的文件小,程序运行时动态加载对应的dll/MT类型表示运行时库集成,生成的文件较大,在链接时将C/C++运行时库集成到程序中。

3. 使用

在使用过程中,如果Release模式下使用MD编译的文件报错缺少 MSVCD140。dll,则可以使用 MT 选项编译,解决缺少动态库的问题。