VS 運行庫MT和MD的區別

前言

日常工作中總會遇到將項目統一配置爲MD,知其然不知所以然。。。。。。所以就有了這篇文章來知其所以然。。。。。

VC項目屬性→配置屬性→C/C++→代碼生成→運行時庫 可以採用的方式有:多線程(/MT)、多線程調試(/MTd)、多線程DLL(/MD)、多線程調試DLL(/MDd)、單線程(/ML)、單線程調試(/MLd)。

目前Win7、Win10等,選擇MD問題不大,但是XP等一些比較老的系統需要選擇MT

兩者的區別

/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

所以,當你用CMAKE生成工程文件時,若CMAKE是用/MT生成的(查看工程原始目錄的CMakeLists.txt),則它所調用的運行時庫爲:LIBCMT.lib,若生成的工程的運行時庫(Runtime Library)你選擇/MD,則此工程在編譯後鏈接的時候,將會調用動態運行時庫:MSVCRT.lib + MSVCR80.DLL,明顯,兩次對同一個某運行時庫裏的函數調用的庫不同,則會出現重定義的錯誤。若此工程生成的是庫文件,則其他工程調用此庫時也必須是/MT。

其他說明

其中以小寫“d”結尾的選項表示的DEBUG版本的,沒有“d”的爲RELEASE版本。大型項目中必須要求所有組件和第三方庫的運行時庫是統一的,否則將會出現LNK2005井噴。

單線程運行時庫選項/ML和/MLd在VS2003以後就被廢了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章