VC++六種Runtime Library

VC++中有六種Runtime Library的類型:redis

類型 簡稱 含義 對應的庫名稱 備註
Single-Threaded /ML Release版的單線程靜態庫 libc.lib VS2003之後被廢棄
Single-Threaded Debug /MLd Debug版的單線程靜態庫 libcd.lib VS2003之後被廢棄
Multi-threaded /MT Release版的多線程靜態庫 libcmt.lib
Multi-threaded Debug /MTd Debug版的多線程靜態庫 libcmtd.lib
Multi-threaded DLL /MD Release版的多線程動態庫 msvcrt.lib+msvcrtxx.dll
Multi-threaded DLL Debug MDd Debug版的多線程動態庫 msvcrtd.lib+msvcrtxxd.dll

你能夠在VS的安裝目錄下找到這些庫文件,如個人VS2010安裝在C:\Program Files (x86)\Microsoft Visual Studio 10.0,則能夠在C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\和C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64\中分別找到對應32位和64位的libcmt.lib、libcmtd.lib、msvcrt.lib、 msvcrtd.lib庫。libc.lib和libcd.lib因爲在VS2005就已經廢棄了,因此在這確定找不到。多線程

經過上面的表格你會發現,多線程的動態運行時庫是|msvcrt.lib+msvcrtxx.dll,之因此是msvcrtxx.dll是由於每一 個版本的VS使用的庫名稱還不同。並且還不止包含一個庫,除了主要的MSVCRT庫外,還有MSVCPRT、MSVCIRT庫。它們之間的對應關係如 下:函數

導入庫 MSVCRT.LIB MSVCRTD.LIB MSVCPRT.LIB MSVCPRTD.LIB MSVCIRT.LIB MSVCIRTD.LIB
Visual C++ 5.0 MSVCRT.DLL MSVCRTD.DLL MSVCP5.DLL MSVCP5D.DLL MSVCIRT.DLL MSVCIRTD.DLL
Visual C++ 6.0 MSVCRT.DLL MSVCRTD.DLL MSVCP6.DLL MSVCP6D.DLL MSVCIRT.DLL MSVCIRTD.DLL
Visual C++ .NET 2002 MSVCR70.DLL MSVCR70D.DLL MSVCP70.DLL MSVCP70D.DLL

Visual C++ .NET 2003 MSVCR71.DLL MSVCR71D.DLL MSVCP71.DLL MSVCP71D.DLL

Visual C++ 2005 MSVCR80.DLL MSVCR80D.DLL MSVCP80.DLL MSVCP80D.DLL

Visual C++ 2008 MSVCR90.DLL MSVCR90.DLL MSVCP90.DLL MSVCP90D.DLL

Visual C++ 2010 MSVCR100.DLL MSVCR100D.DLL MSVCP100.DLL MSVCP100D.DLL

參考閱讀:https://support.microsoft.com/en-us/kb/154753性能

在你的VS安裝目錄下(如C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x64\Microsoft.VC100.CRT),及系統目錄C:\Windows\System3二、C: \Windows\SysWOW64下都能找到對應的.dll庫。spa

不少的軟件在發佈本身的產品時也都會帶上這些DLL(防止用戶的操做系統沒有安裝VS,或在系統目錄下找不到對應的DLL),如我電腦上的百度影音 安裝目錄下就有MSVCR71.DLL(C:\Program Files (x86)\baidu\BaiduPlayer\4.1.2.286\MSVCR71.DLL),WPS的安裝目錄下有msvcr100.dll(C: \Program Files (x86)\WPS Office\9.1.0.5132\wtoolex\msvcr100.dll)和msvcp100.dll(C:\Program Files (x86)\WPS Office\9.1.0.5132\wtoolex\msvcp100.dll)操作系統

(1). 靜態連接的單線程庫
靜態連接的單線程庫只能用於單線程的應用程序, C 運行時庫的目標代碼最終被編譯在應用程序的二進制文件中。經過 /ML 編譯選項能夠設置 Visual C++ 使用靜態連接的單線
程庫。
(2). 靜態連接的多線程庫
靜態連接的多線程庫的目標代碼也最終被編譯在應用程序的二進制文件中,可是它能夠在多線程程序中使用。經過 /MT 編譯選項能夠設置 Visual C++ 使用靜態連接的多線程庫。
該選項生成的可執行文件運行時不須要運行時庫dll的參加,會得到輕微的性能提高,但最終生成的二進制代碼因鏈入龐大的運行時庫實現而變得很是臃腫。當某 項目以靜態連接庫的形式嵌入到多個項目,則可能形成運行時庫的內存管理有多份,最終將致使致命的「Invalid Address specified to RtlValidateHeap」問題。
(3). 動態連接的運行時庫
動態連接的運行時庫將全部的 C 庫函數保存在一個單獨的動態連接庫 MSVCRTxx.DLL 中, MSVCRTxx.DLL 處理了多線程問題。使用 /MD 編譯選項能夠設置 Visual C++ 使用動態。
連接時將按照傳統VC連接dll的方式將運行時庫MSVCRxx.DLL的導入庫MSVCRT.lib連接,在運行時要求安裝了相應版本的VC運行時庫可 再發行組件包(固然把這些運行時庫dll放在應用程序目錄下也是能夠的)。 因/MD和/MDd方式不會將運行時庫連接到可執行文件內部,可有效減小可執行文件尺寸。當多項目以MD方式運做時,其內部會採用同一個堆,內存管理將被 簡化,跨模塊內存管理問題也能獲得緩解。線程

/MDd 、 /MLd 或 /MTd 選項使用 Debug runtime library( 調試版本的運行時刻函數庫 ) ,與 /MD 、 /ML 或 /MT 分別對應。 Debug 版本的 Runtime Library 包含了調試信息,並採用了一些保護機制以幫助發現錯誤,增強了對錯誤的檢測,所以在運行性能方面比不上 Release 版本。調試

結論:/MD和/MDd將是潮流所趨,/ML和/MLd方式請及時放棄,/MT和/MTd在非必要時最好也不要採用了。內存

相關文章
相關標籤/搜索