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