1. 程式人生 > >VS專案屬性中的C/C++執行庫:MT、MTd、MD、MDd

VS專案屬性中的C/C++執行庫:MT、MTd、MD、MDd

這裡寫圖片描述

MT選項:連結LIB版的C和C++執行庫。在連結時就會在將C和C++執行時庫整合到程式中成為程式中的程式碼,程式體積會變大。
MTd選項:LIB的除錯版。
MD選項:使用DLL版的C和C++執行庫,這樣在程式執行時會動態的載入對應的DLL,程式體積會減小,缺點是在系統沒有對應DLL時程式無法執行。
MDd選項:表示使用DLL的除錯版。

關於C和C++執行庫的概念

  為了提高C語言的開發效率,C標準定義了一系列常用的函式,稱為C庫函式。C標準僅僅定義了函式原型,並沒有提供實現。因此這個任務留給了各個支援C語言標準的編譯器。每個編譯器通常實現了標準C的超集,稱為C執行時庫(C Run Time Library),簡稱CRT。對於VC++編譯器來說,它提供的CRT庫支援C標準定義的標準C函式,同時也有一些專門針對Windows系統特別設計的函式
  與C語言類似,C++也定義了自己的標準,同時提供相關支援庫,稱為C++執行時庫或C++標準庫。由於C++對C的相容性,C++標準庫包括了C標準庫,除此之外還包括了IO流和標準模板庫STL。

VC++在何處實現C和C++執行庫

  VC++完美的支援C和C++標準,因此也就按照C和C++標準定義的函式原型實現了上述執行時庫。為了方便有不同需求的客戶使用,VC++分別實現了動態連結庫DLL版本和靜態連結庫LIB版本。同時為了支援程式除錯且不影響程式的效能,又分別提供了對應的除錯版本。除錯版本的名稱在Release版本名稱後添加了字母d。

對於C執行時庫CRT,VC6.0、VC2005、VC2008和VC2010均提供了DLL版本和LIB版本。
上述各個編譯器提供的LIB版的CRT庫,均實現在libcmt.lib。對應的除錯版名稱為libcmtd.lib。

而DLL版本名稱根據編譯器不同而不同,我們可以從名稱上加以分辨。
  VC6.使用的CRT庫的DLL版本在MSVCRT.DLL中實現, 對應除錯版本為MSVCRTD.LIB。
  VC2005使用的CRT庫的DLL版本在MSVCR80.DLL中實現,對應除錯版本為MSVCR80.DLL。
  VC2008使用的CRT庫的DLL版本在MSVCR90.DLL中實現,對應除錯版本為MSVCR90D.DLL。
  VC2010使用的CRT庫的DLL版本在MSVCR100.DLL中實現,對應除錯版本為MSVCR100D.DLL。
  VC2013使用的CRT庫的DLL版本在MSVCR120.DLL中實現,對應除錯版本為MSVCR120D.DLL。

這裡寫圖片描述

對於C++標準庫中的IO流和STL,VC6.0、VC2005、VC2008和VC2010也提供了DLL版本和LIB版本。
  LIB版均實現在libcpmt.lib中,對應的除錯版本為libcpmtd.lib。
不同版本的編譯器實現的DLL也不相同。
  VC6.使用的C++類庫的 DLL版本在MSVCP60.DLL中實現, 對應除錯版本為MSVCP60D.LIB。
  VC2005使用的C++類庫的DLL版本在MSVCP80.DLL中實現,對應除錯版本為MSVCP80.DLL。
  VC2008使用的C++類庫的 DLL版本在MSVCP90.DLL中實現,對應除錯版本為MSVCP90D.DLL。
  VC2010使用的C++類庫的DLL版本在MSVCP100.DLL中實現,對應除錯版本為MSVCP100D.DLL。

這裡寫圖片描述

動態版(DLL)和靜態版(LIB)C和C++執行庫的優缺點

  因為靜態版必須把C和C++執行庫複製到目標程式中(.exe),所以產生的可執行檔案會比較大。同時對於使用多個模組的大型軟體來說,如果每個模組均選擇靜態連結C或C++執行庫,在程式執行時就會存在多個執行庫。在連結時也會出現重複定義的問題,如圖所示。

這裡寫圖片描述

  使用DLL版的C和C++執行庫,程式在執行時動態的載入對應的DLL。程式體積變小,但一個很大的問題就是一旦找不到對應DLL,程式將無法執行(比如所要移植的電腦沒有安裝VC++)。假設使用VC6.0並選擇使用MD選項構建,那麼當用戶使用VC2005來使用這個DLL時很可能出現找不到MSVCRT.DLL或MSVCP60.DLL的情況。