前言:
我们在运行有msvc编译的c++程序时,都需要依赖运行时库,这些库微软已经通过exe压缩包的形式为我们提供了,而且是跟着vs版本走的,我们可以在vs的安装路径下找到这些exe,直接运行后便可以为当前计算机安装对应版本的运行时库了。很多在开发环境上编译好的程序丢到目标机器上运行时出现异常都是由于缺少运行时库导致的。
下载和简介:
如下链接就是vs2015的运行时库下载地址 :https://www.microsoft.com/en-us/download/details.aspx?id=11800
下载页面中的描述中这样写道:
The Visual C++ Redistributable Packages install run-time components that are required to run C++ applications built using Visual Studio 2015.
当前Visual C++ Redistributable Packages 用来安装运行时组件,那些由 Vs 2015 编译的 c++应用程序必须依赖这些组件才能正常运行。
The Visual C++ Redistributable Packages install run-time components of Visual C++ libraries. These components are required to run C++ applications that are developed using Visual Studio 2015 and link dynamically to Visual C++ libraries. These package can be used to run such applications on a computer even if it does not have Visual Studio 2015 installed. These packages install run-time components of these libraries: C Runtime (CRT), Standard C++, MFC, C++ AMP, and OpenMP.
Visual C++ Redistributable Packages用来安装Visual C++ 库的运行时组件,那些用vs2015开发的c++应用程序,以及那些使用了Visual C++ 动态库的应用程序均需要这些组件作为必要的运行时支撑。有了这些组件,这些应用程序便可以运行在任何机器上,而不要求这些机器必须安装vs2015。
这些运行时组件包括: c的运行时库(CRT)、标准c++、MFC、c++ AMP 和 OpenMP
并不是所有的操作系统都能运行所有版本的Visual C++ Redistributable Packages,具体参照下载页面的System Requires分段 https://www.microsoft.com/en-us/download/details.aspx?id=48145
Visual Studio 和 VC 以及 MSVC的关系
Visual Studio是一个集成IDE环境,其安装目录下包括很多内容,有VC、VB、Python、JS、VC#等等,这些都是在安装 VS的时候手工指定的。每一个目录下都是相应语言/组件的一套开发SDK。
VC便是其中一个目录,其中包括Windows环境下进行 C/C++开发的所有 SDK,这包括 库的导出库文件、库的动态库文件、库的头文件、编译器、连接器、二进制文件解析工具等等。做Windows C/C++环境下的开发,此目录可以满足我们所有需求。
我们说的MSVC 是指 VC 目录中的编译器,而其版本,一般也只编译器版本。
而VC 版本一般只 VC目录中的 C/C++ 库的版本。
VS 和 VC版本的对应关系如下:
Visual Studio 6 | VC6 |
Visual Studio 2003 | VC7 |
Visual Studio 2005 | VC8 |
Visual Studio 2008 | VC9 |
Visual Studio 2010 | VC10 |
Visual Studio 2012 | VC11 |
Visual Studio 2013 | VC12 |
Visual Studio 2015 | VC14 |
Visual Studio 2017 | VC15 |
VS 和 MSVC版本的对应关系如下(这一般用在代码里做宏定义分支判断使用):
MSVC++ 4.x | _MSC_VER == 1000 |
MSVC++ 5.0 | _MSC_VER == 1100 |
MSVC++ 6.0 | _MSC_VER == 1200 |
MSVC++ 7.0 | _MSC_VER == 1300 |
MSVC++ 7.1 | _MSC_VER == 1310 (Visual Studio 2003) |
MSVC++ 8.0 | _MSC_VER == 1400 (Visual Studio 2005) |
MSVC++ 9.0 | _MSC_VER == 1500 (Visual Studio 2008) |
MSVC++ 10.0 | _MSC_VER == 1600 (Visual Studio 2010) |
MSVC++ 11.0 | _MSC_VER == 1700 (Visual Studio 2012) |
MSVC++ 12.0 | _MSC_VER == 1800 (Visual Studio 2013) |
MSVC++ 14.0 | _MSC_VER == 1900 (Visual Studio 2015) |
MSVC++ 14.1 | _MSC_VER == 1911 (Visual Studio 2017) |
Qt中的运行时库:
Windows版本的Qt组件是由相应版本的MSVC编译器编译的,因此其依赖于对应vs版本的运行时库,因此Qt在发布的时候都会把相应的vc_redist.exe一并放在bin目录下,当我们发现自己编译的Qt工程缺少运行时库时,找到相应的exe运行一下即可。
具体路径: C:\Qt\Qt5.12.6\vcredist
例如:
运行时库的安装目录:
Visual C++ Redistributable Packages 的默认安装目录为:
System 、System32 、SysWOW64
VS目录下也有一份运行时库:
我们可以手动运行 vcredist_xxx.exe来安装运行时库到 上述三个 SysXXX 目录下,这一般使用在那些没有开发环境的目标运行机器上。
那么,为什么我们装完VS就能自动使用这些运行时库了呢?
原来,VS在安装时自带了一份并放在自己的目录下,那么我们从VS启动程序时便不需要去SysXXX中找这些库,直接就可以使用,比如vs2017 对应的目录为:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC
为什么VS中正常启动,但是手工运行exe却失败?
但是,我们手动运行开发生成的exe时,还是会去SysXXX中找,这也是为什么有时候我们我们可以在VS环境中顺利启动程序,但是在Release 和 Debug中手动运行exe的时候确提示缺少xxx.dll的原因。
ps:
如果我们手动运行VS目录下的 vcredist_xxx.exe ,会发现 安装页面中的版本号 和 vs自带的运行库版本号 是一致的。
vs自带的运行库的路径:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools
vs提供的运行库安装包的路径:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist
这二者都在VS 安装路径的 VC目录下