VC編譯選項(xiàng) 多線程(/MT)
多線程調(diào)試(/MTd)
多線程 DLL (/MD)
多線程調(diào)試 DLL (/MDd)
C 運(yùn)行時(shí)庫(kù) 庫(kù)文件
Single thread(static link) ML libc.lib
Debug single thread(static link) MLd libcd.lib
MultiThread(static link) MT libcmt.lib
Debug multiThread(static link) MTd libcmtd.lib
MultiThread(dynamic link) MD msvert.lib
Debug multiThread(dynamic link) MDd msvertd.lib
3. 各種 C 運(yùn)行時(shí)庫(kù)的區(qū)別
( 1 )靜態(tài)鏈接的單線程庫(kù)
靜態(tài)鏈接的單線程庫(kù)只能用于單線程的應(yīng)用程序, C 運(yùn)行時(shí)庫(kù)的目標(biāo)代碼最終被編譯在應(yīng)用程序的二進(jìn)制文件中。通過(guò) /ML 編譯選項(xiàng)可以設(shè)置 Visual C++ 使用靜態(tài)鏈接的單線
程庫(kù)。
( 2 )靜態(tài)鏈接的多線程庫(kù)
靜態(tài)鏈接的多線程庫(kù)的目標(biāo)代碼也最終被編譯在應(yīng)用程序的二進(jìn)制文件中,但是它可以在多線程程序中使用。通過(guò) /MT 編譯選項(xiàng)可以設(shè)置 Visual C++ 使用靜態(tài)鏈接的多線程庫(kù)。
( 3 )動(dòng)態(tài)鏈接的運(yùn)行時(shí)庫(kù)
動(dòng)態(tài)鏈接的運(yùn)行時(shí)庫(kù)將所有的 C 庫(kù)函數(shù)保存在一個(gè)單獨(dú)的動(dòng)態(tài)鏈接庫(kù) MSVCRTxx.DLL 中, MSVCRTxx.DLL 處理了多線程問(wèn)題。使用 /MD 編譯選項(xiàng)可以設(shè)置 Visual C++ 使用動(dòng)態(tài)
鏈接的運(yùn)行時(shí)庫(kù)。
/MDd 、 /MLd 或 /MTd 選項(xiàng)使用 Debug runtime library( 調(diào)試版本的運(yùn)行時(shí)刻函數(shù)庫(kù) ) ,與 /MD 、 /ML 或 /MT 分別對(duì)應(yīng)。 Debug 版本的 Runtime Library 包含了調(diào)試信息
,并采用了一些保護(hù)機(jī)制以幫助發(fā)現(xiàn)錯(cuò)誤,加強(qiáng)了對(duì)錯(cuò)誤的檢測(cè),因此在運(yùn)行性能方面比不上 Release 版本。
下面是msdn關(guān)于Visual C++ 編譯器選項(xiàng)的說(shuō)明:
這些選項(xiàng)選擇單線程或多線程運(yùn)行時(shí)例程,指示多線程模塊是否為 DLL,并選擇運(yùn)行時(shí)庫(kù)的發(fā)布版本或調(diào)試版本。
選項(xiàng) 說(shuō)明
/MD 定義 _MT 和 _DLL 以便同時(shí)從標(biāo)準(zhǔn) .h 文件中選擇運(yùn)行時(shí)例程的多線程特定版本和 DLL 特定版本。此選項(xiàng)還使編譯器將庫(kù)名 MSVCRT.lib 放入 .obj 文件中。
用此選項(xiàng)編譯的應(yīng)用程序靜態(tài)鏈接到 MSVCRT.lib。該庫(kù)提供允許鏈接器解析外部引用的代碼層。實(shí)際工作代碼包含在 MSVCR71.DLL 中,該庫(kù)必須在運(yùn)行時(shí)對(duì)于與 MSVCRT.lib 鏈
接的應(yīng)用程序可用。
當(dāng)在定義了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情況下使用 /MD 時(shí),它將導(dǎo)致應(yīng)用程序通過(guò)靜態(tài)多線程標(biāo)準(zhǔn) C++ 庫(kù) (libcpmt.lib) 而非動(dòng)態(tài)版本 (msvcprt.lib) 進(jìn)行鏈接
,同時(shí)仍通過(guò) msvcrt.lib 動(dòng)態(tài)鏈接到主 CRT。
/MDd 定義 _DEBUG、_MT 和 _DLL,以便從標(biāo)準(zhǔn) .h 文件中選擇運(yùn)行時(shí)例程的調(diào)試多線程特定版本和 DLL 特定版本。它還使編譯器將庫(kù)名 MSVCRTD.lib 放入 .obj 文件中。
/ML 使編譯器將庫(kù)名 LIBC.lib 放入 .obj 文件中,以便鏈接器使用 LIBC.lib 解析外部符號(hào)。這是編譯器的默認(rèn)操作。LIBC.lib 不提供多線程支持。
/MLd 定義 _DEBUG 并使編譯器將庫(kù)名 LIBCD.lib 放入 .obj 文件中,以便鏈接器使用 LIBCD.lib 解析外部符號(hào)。LIBCD.lib 不提供多線程支持。
/MT 定義 _MT,以便從標(biāo)準(zhǔn)頭 (.h) 文件中選擇運(yùn)行時(shí)例程的多線程特定版本。此選項(xiàng)還使編譯器將庫(kù)名 LIBCMT.lib 放入 .obj 文件中,以便鏈接器使用 LIBCMT.lib 解析
外部符號(hào)。創(chuàng)建多線程程序需要 /MT 或 /MD(或它們的調(diào)試等效選項(xiàng) /MTd 或 /MDd)。
/MTd 定義 _DEBUG 和 _MT。定義 _MT 會(huì)導(dǎo)致從標(biāo)準(zhǔn) .h 文件中選擇運(yùn)行時(shí)例程的多線程特定版本。此選項(xiàng)還使編譯器將庫(kù)名 LIBCMTD.lib 放入 .obj 文件中,以便鏈接器使
用 LIBCMTD.lib 解析外部符號(hào)。創(chuàng) 建多線程程序需要 /MTd 或 /MDd(或它們的非調(diào)試等效選項(xiàng) /MT 或 MD)。
/LD 創(chuàng)建 DLL。
將 /DLL 選項(xiàng)傳遞到鏈接器。鏈接器查找 DllMain 函數(shù),但并不需要該函數(shù)。如果沒(méi)有編寫(xiě) DllMain 函數(shù),鏈接器將插入返回 TRUE 的 DllMain 函數(shù)。
鏈接 DLL 啟動(dòng)代碼。
如果命令行上未指定導(dǎo)出 (.exp) 文件,則創(chuàng)建導(dǎo)入庫(kù) (.lib);將導(dǎo)入庫(kù)鏈接到調(diào)用您的 DLL 的應(yīng)用程序。
將 /Fe 解釋為命名 DLL 而不是 .exe 文件;默認(rèn)程序名成為基名稱(chēng).dll 而不是基名稱(chēng).exe。
如果還未顯式指定 /M 選項(xiàng)之一,則將默認(rèn)運(yùn)行時(shí)庫(kù)支持更改為 /MT。
/LDd 創(chuàng)建調(diào)試 DLL。定義 _DEBUG。
警告 不要混合使用運(yùn)行時(shí)庫(kù)的靜態(tài)版本和動(dòng)態(tài)版本。在一個(gè)進(jìn)程中有多個(gè)運(yùn)行時(shí)庫(kù)副本會(huì)導(dǎo)致問(wèn)題,因?yàn)楦北局械撵o態(tài)數(shù)據(jù)不與其他副本共享。鏈接器禁止在 .exe 文件內(nèi)
部既使用靜態(tài)版本又使用動(dòng)態(tài)版本鏈接,但您仍可以使用運(yùn)行時(shí)庫(kù)的兩個(gè)(或更多)副本。例如,當(dāng)與用動(dòng)態(tài) (DLL) 版本的運(yùn)行時(shí)庫(kù)鏈接的 .exe 文件一起使用時(shí),用靜態(tài)(非
DLL)版本的運(yùn)行時(shí)庫(kù)鏈接的動(dòng)態(tài)鏈接庫(kù)可能導(dǎo)致問(wèn)題。(還應(yīng)該避免在一個(gè)進(jìn)程中混合使用這些庫(kù)的調(diào)試版本和非調(diào)試版本)。