轉:http://blog.csdn.net/nodeathphoenix/article/details/7550546
1.各個選項代表的含義
編譯選項 |
包含 |
靜態鏈接的lib |
說明 |
/MD |
_MT、_DLL |
MSVCRT.lib |
多線程、Release、DLL版本的運行時庫 ---只能用於Release版本 |
/MDd |
_DEBUG、_MT、_DLL |
MSVCRTD.lib |
多線程、Debug、DLL版本的運行時庫 ----只能用於Debug版本 |
/MT |
_MT |
LIBCMT.lib |
多線程、Release版本的運行時庫 |
/MTd |
_DEBUG、_MT |
LIBCMTD.lib |
多線程、Debug版本的運行時庫
|
簡單的說:
(1)/MD,表示運行時庫由操作系統提供一個DLL,程序里不集成。
(2)/MT,表示運行時庫由程序集成,程序不再需要操作系統提供運行時庫DLL。
/MT是"multithread, static version" 意思是多線程靜態的版本,定義了它后,編譯器把LIBCMT.lib安置到OBJ文件中,讓鏈接器使用LIBCMT.lib 處理外部符號。
/MD是"multithread- and DLL-specific version",意思是多線程DLL版本,定義了它后,編譯器把MSVCRT.lib安置到OBJ文件中,它連接到DLL的方式是靜態鏈接,實際上工作的庫是MSVCR80.DLL。
即:
靜態運行時庫:LIBCMT.lib
動態運行時庫:MSVCRT.lib +MSVCR80.DLL
2./MD、/MT的選擇
1、為什么選擇/MD,不選/MT?
(1)程序就不需要靜態鏈接運行時庫,可以減小軟件的大小;
(2)所有的模塊都采用/MD,使用的是同一個堆,不存在A堆申請,B堆釋放的問題。
2、為什么選擇/MT,不選擇/MD?
(1)有些系統可能沒有程序所需要版本的運行時庫,程序必須把運行時庫靜態鏈接上。
3、多個模塊,必須選擇相同類型的運行時庫,不要混合使用。
3.選擇/MT需要解決的堆空間釋放問題
不同的模塊各自有一份C運行時庫代碼,各個C運行庫會有各自的堆,導致了各個模塊會有各自的堆。如果在A堆中申請空間,到B堆中釋放就會有崩潰,在模塊A申請的空間,必須在模塊A中釋放。
附件(下載地址:http://files.cnblogs.com/cswuyg/Test_MD_and_MT.rar)的DLL以及DLLUser代碼,以STL的string為例,通過修改編譯選項驗證了這個問題。(string在賦值的時候需要釋放掉原來的空間,然后再申請新的空間存儲新的內容。)