VC运行时库(/MD、/MT等)
? ??VC項目屬性→配置屬性→C/C++→代碼生成→運行時庫 可以采用的方式有:多線程(/MT)、多線程調(diào)試(/MTd)、多線程DLL(/MD)、多線程調(diào)試DLL(/MDd)、單線程(/ML)、單線程調(diào)試(/MLd)。
?
| Reusable Library | Switch | Library | Macro(s) Defined |
|---|---|---|---|
| Single Threaded | /ML | LIBC | (none) |
| Static MultiThread | /MT | LIBCMT | _MT |
| Dynamic Link (DLL) | /MD | MSVCRT | _MT and _DLL |
| Debug Single Threaded | /MLd | LIBCD | _DEBUG |
| Debug Static MultiThread | /MTd | LIBCMTD | _DEBUG and _MT |
| Debug Dynamic Link (DLL) | /MDd | MSVCRTD | _DEBUG, _MT, and _DLL |
?
?
??? 其中以小寫“d”結(jié)尾的選項表示的DEBUG版本的,沒有“d”的為RELEASE版本。大型項目中必須要求所有組件和第三方庫的運行時庫是統(tǒng)一的,否則將會出現(xiàn)LNK2005井噴。
??? 單線程運行時庫選項/ML和/MLd在VS2003以后就被廢了。
??? /MT和/MTd表示采用多線程CRT庫的靜態(tài)lib版本。該選項會在編譯時將運行時庫以靜態(tài)lib的形式完全嵌入。該選項生成的可執(zhí)行文件運行時不需要運行時庫dll的參加,會獲得輕微的性能提升,但最終生成的二進制代碼因鏈入龐大的運行時庫實現(xiàn)而變得非常臃腫。當(dāng)某項目以靜態(tài)鏈接庫的形式嵌入到多個項目,則可能造成運行時庫的內(nèi)存管理有多份,最終將導(dǎo)致致命的“Invalid Address specified to RtlValidateHeap”問題。另外托管C++和CLI中不再支持/MT和/MTd選項。
??? /MD和/MDd表示采用多線程CRT庫的動態(tài)dll版本,會使應(yīng)用程序使用運行時庫特定版本的多線程DLL。鏈接時將按照傳統(tǒng)VC鏈接dll的方式將運行時庫MSVCRxx.DLL的導(dǎo)入庫MSVCRT.lib鏈接,在運行時要求安裝了相應(yīng)版本的VC運行時庫可再發(fā)行組件包(當(dāng)然把這些運行時庫dll放在應(yīng)用程序目錄下也是可以的)。?因/MD和/MDd方式不會將運行時庫鏈接到可執(zhí)行文件內(nèi)部,可有效減少可執(zhí)行文件尺寸。當(dāng)多項目以MD方式運作時,其內(nèi)部會采用同一個堆,內(nèi)存管理將被簡化,跨模塊內(nèi)存管理問題也能得到緩解。
??? 結(jié)論:/MD和/MDd將是潮流所趨,/ML和/MLd方式請及時放棄,/MT和/MTd在非必要時最好也不要采用了。
?
參考:
《How to link with the correct C Run-Time (CRT) library》
《/MD、/MT、/LD(使用運行時庫)》
轉(zhuǎn)載于:https://www.cnblogs.com/xiongjiaji/archive/2011/06/01/2476508.html
總結(jié)
以上是生活随笔為你收集整理的VC运行时库(/MD、/MT等)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加速
- 下一篇: 看懂SQL Server的查询计划(绝对