VS:執行庫 MT、MTd、MD、MDd
1. 問題
VS中開發windows程式是經常需要將編譯OK的程式移到另一臺機器上執行的情況,有時會出現錯誤;
這一般是因為另一臺機器上面沒有安裝相應的執行庫導致的,
那麼執行庫的選項MT、MTd、MD、MDd分別代表什麼意義呢?
2. 概念
這是msdn上面的解釋:
MT:mutithread,多執行緒庫,編譯器會從執行庫裡面選擇多執行緒靜態連線庫
MTd:mutithread+debug,多執行緒除錯版,連線LIBMITD.lib庫
MD:MT+DLL,多執行緒動態庫,連線MSVCRT.lib庫,這是個匯入庫,對應動態庫為MSVCRT.dll
MDd: MT+DLL+debug,多執行緒動態除錯庫,連線MSVCRTD.lib庫,對應動態庫為MSVCRTD.dll
開發多執行緒程式時,需要選擇MT、MTd、MD、MDd其中的一個。
3. 結論
(1)對於MT/MTd,由於連線執行時庫是LIBCMT.lib/LIBCMTD.lib,這兩個庫是靜態庫,所以此種方式編譯的程式,移到另一臺機器上面也可以正常執行。
(2)但是對於MD/MDd,連線的是動態庫,所以如果另一臺機器上沒有MSVCRT.dll/MSVCRTD.dll時,就提示缺少動態庫這樣的錯誤。
曾經犯這樣的錯誤,以為以MT/MTd方式編譯,程式對所有的庫都是靜態連結的,其實錯了,它只能決定執行時庫是動態連結還是靜態連結,對使用者自己寫的庫或其他第三方庫,其連線方式取決於程式碼(顯示連線動態庫Loadlibrary)或所提供的lib檔案(為匯入庫還是靜態庫),移動程式到別的機器上時,還是要帶上所需要的動態庫的。
【注】:一個程式中混合了不同的執行庫(靜態庫和動態庫,除錯庫和非除錯庫),可能會產生衝突,所以一個程式中應該使用相同的執行時庫。
參考文章: