VS、VC版本对应关系

Visual Studio IDE Version MSVC++ ToolSet _MSC_VER
vs2022 17.x 14.3x v143 193x
vs2019 16.x 14.2x v142 192x
vs2017 15.y 14.1x v141 191x
vs2015 14.0 14.0 v140 1900
vs2013 12.0 12.0 v120 1800
vs2012 11.0 11.0 v110 1700
vs2010 10.0 10.0 v100 1600
vs2008 9.0 9.0 v90 1500
vs2005 8.0 8.0 v80 1400
vs2003 7.1 7.1 v71 1310
vs2002 7.0 7.0 v70 1300
vc6.0 6.0 6.0 v60 1200

从 vs2017 开始,MSVC++ 版本号与 Visual Studio 版本号不再同步,并且每个子版本都会递增,_MSC_VER 随之递增。除 vs2017 以外,MSVC++、_MSC_VER 递增的序号与 IDE 子版本递增的序号一致。

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