編程 MD(d)、MT(d)編譯選項的區別


轉: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在賦值的時候需要釋放掉原來的空間,然后再申請新的空間存儲新的內容。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM