【PE】VS編譯選項MD,MDd,MT,MTd的使用和區別
阿新 • • 發佈:2019-01-09
###Date: 2017/10/23
一、CRT編譯選項的配置
編譯選項的位置:
屬性->C/C++->程式碼生成->執行庫
二、編譯選項的型別
(1)/MD
使應用程式使用執行時庫的多執行緒並特定於DLL 的版本。定義 _MT 和 _DLL,並使編譯器將庫名 MSVCRT.lib 放入 .obj檔案中。用此選項編譯的應用程式靜態連結到MSVCRT.lib。該庫提供允許連結器解析外部引用的程式碼層。實際工作程式碼包含在 MSVCR90.DLL, 中,該庫必須在執行時對於與MSVCRT.lib 連結的應用程式可用。當/MD 與 _STATIC_CPPLIB 前處理器定義 (/D_STATIC_CPPLIB)一起使用時,您的應用程式將與靜態多執行緒標準 C++ (libcpmt.lib) 而非動態版本 (msvcprt.lib)連結,但仍通過 msvcrt.lib 動態連結到主 CRT。請注意,不支援_STATIC_CPPLIB 前處理器定義和 /clr 或 /clr:pure 編譯器選項的組合。有關 /clr選項的限制的更多資訊,請參見 /clr 限制。
(2)/MDd
定義_DEBUG、_MT 和 _DLL,並使應用程式使用執行時庫的除錯多執行緒並特定於 DLL 的版本。它還使編譯器將庫名MSVCRTD.lib 放入 .obj 檔案中。
(3)/MT
使應用程式使用執行時庫的多執行緒靜態版本。定義_MT 並使編譯器將庫名 LIBCMT.lib 放入 .obj 檔案中,以便連結器使用 LIBCMT.lib解析外部符號。
(4)/MTd
定義_DEBUG 和 _MT。此選項還使編譯器將庫名 LIBCMTD.lib 放入 .obj 檔案中,以便連結器使用LIBCMTD.lib 解析外部符號。
(5)/LD
建立DLL。
將/DLL 選項傳遞到連結器。連結器查詢 DllMain 函式,但並不需要該函式。如果沒有編寫 DllMain 函式,連結器將插入返回TRUE 的 DllMain 函式。
連結DLL 啟動程式碼。
如果命令列上未指定匯出(.exp) 檔案,則建立匯入庫 (.lib);將匯入庫連結到呼叫您的 DLL的應用程式。
將/Fe(命名 EXE 檔案) 解釋為命名 DLL 而不是 .exe 檔案;預設程式名成為基名稱.dll而不是基名稱.exe。
除非顯式指定/MD,否則將暗指 /MT。
(6)/LDd
建立除錯DLL。定義 _MT 和 _DEBUG。
注意事項:
/MD表示執行時庫不整合,生成的檔案小,程式執行時動態載入對應的DLL;
/MT表示執行時庫整合,生成的檔案較大,在連結時將C/C++執行時庫整合到程式中成為程式的程式碼。
C執行時庫實際上是標準C/C++庫函式的實現。VC++中的編譯器提供了dll實現C/C++庫函式。
三、如何選擇
選/MD的理由:檔案小,使用的是同一個堆,不存在A申請,B釋放的問題;
選/MT的理由:移植性好,減少依賴。參考:http://blog.csdn.net/whatday/article/details/7933133
http://blog.sina.com.cn/s/blog_6f7265cf0101nhs0.html
http://blog.csdn.net/u010059658/article/details/51026662
http://www.cnblogs.com/cuish/p/3146937.html