/MD, /MDD, /ML, /MT,/MTD(使用运行时库) .
1.?VC編譯選項
多線程(/MT)
多線程調(diào)試(/MTd)
多線程 DLL (/MD)
多線程調(diào)試 DLL (/MDd)
2. 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)用程序的二進制文件中。通過 /ML 編譯選項可以設(shè)置 Visual C++ 使用靜態(tài)鏈接的單線
程庫。
(2)靜態(tài)鏈接的多線程庫
靜態(tài)鏈接的多線程庫的目標(biāo)代碼也最終被編譯在應(yīng)用程序的二進制文件中,但是它可以在多線程程序中使用。通過 /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)試信息,并采用了一些保護機制以幫助發(fā)現(xiàn)錯誤,加強了對錯誤的檢測,因此在運行性能方面比不上 Release 版本。
4. 下面是msdn關(guān)于Visual C++ 編譯器選項的說明:
這些選項選擇單線程或多線程運行時例程,指示多線程模塊是否為 DLL,并選擇運行時庫的發(fā)布版本或調(diào)試版本。
?????? 選項???? 說明
(1). /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) 進行鏈接,同時仍通過 msvcrt.lib 動態(tài)鏈接到主 CRT。
(2). /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 不提供多線程支持。
(3). /MLd???? 定義 _DEBUG 并使編譯器將庫名 LIBCD.lib 放入 .obj 文件中,以便鏈接器使用 LIBCD.lib 解析外部符號。LIBCD.lib 不提供多線程支持。
(4). /MT???? 定義 _MT,以便從標(biāo)準(zhǔn)頭 (.h) 文件中選擇運行時例程的多線程特定版本。此選項還使編譯器將庫名 LIBCMT.lib 放入 .obj 文件中,以便鏈接器使用 LIBCMT.lib 解析
外部符號。創(chuàng)建多線程程序需要 /MT???? 或 /MD(或它們的調(diào)試等效選項 /MTd 或 /MDd)。
(5). /MTd???? 定義 _DEBUG 和 _MT。定義 _MT 會導(dǎo)致從標(biāo)準(zhǔn) .h 文件中選擇運行時例程的多線程特定版本。此選項還使編譯器將庫名 LIBCMTD.lib 放入 .obj 文件中,以便鏈接器使
用 LIBCMTD.lib 解析外部符號。創(chuàng)??? 建多線程程序需要 /MTd 或 /MDd(或它們的非調(diào)試等效選項 /MT 或 MD)。
(6). /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。
(7). /LDd???? 創(chuàng)建調(diào)試 DLL。定義 _DEBUG。
??? 警告?? 不要混合使用運行時庫的靜態(tài)版本和動態(tài)版本。在一個進程中有多個運行時庫副本會導(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)該避免在一個進程中混合使用這些庫的調(diào)試版本和非調(diào)試版本)。
?
轉(zhuǎn)自:http://blog.csdn.net/wfq_1985/article/details/7303825
轉(zhuǎn)載于:https://www.cnblogs.com/de0319gh/p/3659727.html
總結(jié)
以上是生活随笔為你收集整理的/MD, /MDD, /ML, /MT,/MTD(使用运行时库) .的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对javascript中的匿名函数的理解
- 下一篇: qt 状态栏