VS 運行庫MT、MD的區別

https://www.jianshu.com/p/f43afc1d5946

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

目前Win七、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。調試

即:ci

靜態運行時庫:LIBCMT.libget

動態運行時庫:MSVCRT.lib + MSVCR80.DLL編譯器

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

相關文章
相關標籤/搜索