VS、VC版本对应关系

MSVC++ Visual Studio _MSC_VER
14.2x vs2019 192x
14.1x vs2017 191x
14.0 vs2015 1900
12.0 vs2013 1800
11.0 vs2012 1700
10.0 vs2010 1600
9.0 vs2008 1500
8.0 vs2005 1400
7.1 vs2003 1310
7.0 vs2002 1300
6.0 vc6.0 1200

从 vs2017 开始,MSVC++ 版本号与 Visual Studio 版本号不再同步,并且每个子版本都会递增

MT、MTd、MD、MDd、ML、MLd区别

Visual C++ 提供了两种版本的 C 运行时库。一个版本供单线程应用程序调用,另一个版本供多线程应用程序调用。Visual C++ 提供的多线程运行时库又分为静态链接库和动态链接库两类,而每一类运行时库又可再分为 debug 版和 release 版,因此 Visual C++ 共提供了 6 个运行时库。

库类型 释义 线程类型 链接类型 发布类型 宏定义
ML Single thread(static link) 单线程 静态 Release (none)
MLd Debug single thread(static link) 单线程 静态 Debug _DEBUG
MT MultiThread(static link) 多线程 静态 Release _MT
MTd Debug multiThread(static link) 多线程 静态 Debug _DEBUG and _MT
MD MultiThread(dynamic link) 多线程 动态 Release _MT and _DLL
MDd Debug multiThread(dynamic link) 多线程 动态 Debug _DEBUG, _MT, and _DLL
  1. /ML和/MLd表示单线程运行时库,在VS2003以后就被废了。
  2. /MT和/MTd表示采用多线程CRT库的静态lib版本。
  3. /MD和/MDd表示采用多线程CRT库的动态dll版本。

多线程运行时库与单线程运行时库区别:

  1. 类似 errno 的全局变量,每个线程单独设置一个。这样从每个线程中可以获取正确的错误信息。
  2. 多线程库中的数据结构以同步机制加以保护。这样可以避免访问时候的冲突。

C 运行时库 (CRT) 和 C++ 标准库(STL)

C++ Standard Library Characteristics Option Preprocessor directives
libcpmt.lib Multithreaded, static link /MT _MT
msvcprt.lib Multithreaded, dynamic link (import library for msvcp.dll) /MD _MT, _DLL
libcpmtd.lib Multithreaded, static link /MTd _DEBUG, _MT
msvcprtd.lib Multithreaded, dynamic link (import library for msvcpd.dll) /MDd _DEBUG, _MT, _DLL

Linker Tools Warning LNK4098

编译报错:

1
2
3
4
LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
……
……
MSVCRT.lib(_chandler4gs_.obj) : error LNK2019: 无法解析的外部符号 __except_handler4_common,该符号在函数 __except_handler4 中被引用

|链接类型|运行时库 |忽略这些库|依赖这些库|
|—|—|—|
|ML|单线程 (libc.lib) |libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib|未知|
|MLd|调试单线程 (libcd.lib) |libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib|未知|
|MT|静态链接多线程 (libcmt.lib) |libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib|libvcruntime.lib libucrt.lib|
|MTd|调试静态链接多线程 (libcmtd.lib) |libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib|libvcruntimed.lib libucrtd.lib|
|MD|动态链接多线程 (msvcrt.lib) |libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib|vcruntime.lib ucrt.lib|
|MDd|调试动态链接多线程 (msvcrtd.lib) |libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib|vcruntimed.lib ucrtd.lib|

So long as you do not link with the /nodefaultlib option, all of the correct library files will be found when you link your project. If you link with the /nodefaultlib option, you will need to link several extra libraries when you link. For example, whereas you previously might have just linked msvcrt.lib in order to use the CRT DLL, you will now also need to link vcruntime.lib and ucrt.lib.

官方说明:https://docs.microsoft.com/en-us/cpp/error-messages/tool-errors/linker-tools-warning-lnk4098?view=msvc-160
运行时库:https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=msvc-160
Universal CRT:https://devblogs.microsoft.com/cppblog/introducing-the-universal-crt