1. 程式人生 > >【PE】VS編譯選項MD,MDd,MT,MTd的使用和區別

【PE】VS編譯選項MD,MDd,MT,MTd的使用和區別

###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