1. 程式人生 > >vc++編譯時執行庫選擇(/MT、/MTd、/MD、/MDd)

vc++編譯時執行庫選擇(/MT、/MTd、/MD、/MDd)

這裡寫圖片描述
在vs中,專案屬性 -》C/C++ -》程式碼生成 -》執行庫 選項內有四個選項:多執行緒(/MT)、多執行緒除錯(/MTd)、多執行緒DLL(/MD)、多執行緒除錯DLL(/MDd)。這個設定代表什麼意思?四個選項又是什麼意思,有什麼區別?接下來詳細討論。
先奉上一個寫得非常詳細的部落格連結:你所不知道的C和C++執行庫,這個文章中寫得非常詳細,本文也主要參考了這篇文章。
還有這篇C Runtime Library 的來歷

何為C執行庫、C++標準庫

C標準定義了一系列常用函式,成為C庫函式。C標準僅僅定義了函式原型,沒有提供實現。因此這個任務留給了各個支援C語言標準的編譯器。每個編譯器通常實現了標準C的超集,稱為C執行時庫(C Run-Time Library)。C run-time Library包含了C程式執行的最基本和最常用的函式,沒有C run-time Library則main()函式不會被呼叫,exit()也不能被響應。C執行庫與平臺相關。
到了C++的世界,有了另外一個概念:Standard C++ Library。因為C++是C的超集,所以Standard C++ Library包括了C run-time Library和STL。VC針對C++ 加入的Standard C++ Library主要包括:libcp.lib、libcpmt.lib、msvcprt.lib。
在windows環境下,VC提供的C Run-Time Library又分為動態執行時庫和靜態執行時庫。動態執行時庫主要是DLL庫檔案msvcrt.dll(vc 6.0,之後是msvcr100.dll等),靜態執行時庫對應的主要檔案是libc.lib(Single thread static library, retail version) 、LIBCMT.LIB (Multithread static library, retail version) 。msvcrt.dll執行時庫提供幾千個C函式,包括printf,程式執行時很大部分時間都是在這些執行庫中。到底使用哪些庫取決於你的編譯器及編譯選項:/MT、/MTd、/MD、/MDd。
動態執行時庫


動態執行時庫主要包括:
·DLL庫檔案:msvcrt.dll(或 MSVCRTD.DLL for debug build)
·對應的Import Library檔案:MSVCRT.LIB(或 MSVCRTD.LIB for debug build)
上面為vc6.0編譯器用到的庫,在vs中為msvcr100.dll等

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。

靜態執行時庫
靜態執行時庫(release版)對應的主要檔案包括:
LIBC.LIB(Single thread static library, retail version)
LIBCMT.LIB(Multithread static library, retail version)
不同編譯器實現的庫名都相同,都為libcmt.lib,除錯版為libcmtd.lib。

C++標準庫
對於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。

編譯器中執行庫設定

/MT、/MTd、/MD、/MDd各選項區別

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

帶T的連結靜態庫lib;帶D連結動態庫dll;帶d為除錯版本,庫名加d

如何選擇執行庫

先看幾個錯誤:
1. error LNK2038
這裡寫圖片描述
2. error LNK2005
這裡寫圖片描述

當引用的庫和當前專案設定的執行庫不一致時,會出現error LNK2038: 檢測到“RuntimeLibrary”的不匹配項………
當引用的庫或當前的庫有一個使用/MT時,會出現error LNK2005:………
所以若當前VC專案不引用其他VC專案,則可以使用任意一種執行庫選項;若需要引用其他VC專案,則所有的專案都需設定執行庫選項為/MD或/MDd。