前言:
我們在運行有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目錄下