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