Win MSVC 版本及运行时库
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 |
- /ML和/MLd表示单线程运行时库,在VS2003以后就被废了。
- /MT和/MTd表示采用多线程CRT库的静态lib版本。
- /MD和/MDd表示采用多线程CRT库的动态dll版本。
多线程运行时库与单线程运行时库区别:
- 类似 errno 的全局变量,每个线程单独设置一个。这样从每个线程中可以获取正确的错误信息。
- 多线程库中的数据结构以同步机制加以保护。这样可以避免访问时候的冲突。
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 |
/MD | _MT, _DLL |
libcpmtd.lib | Multithreaded, static link | /MTd | _DEBUG, _MT |
msvcprtd.lib | Multithreaded, dynamic link (import library for msvcp |
/MDd | _DEBUG, _MT, _DLL |
Linker Tools Warning LNK4098
编译报错:
1 | LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library |
链接类型 | 运行时库 | 忽略这些库 | 依赖这些库 |
---|---|---|---|
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